You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino按键触发发送数字至Python脚本功能失效求助

解决Arduino按键发送数据到Python并触发F13/F14的问题

嘿,我来帮你搞定这个问题!你的核心问题出在两个地方:Arduino代码没初始化串口,以及Python没有正确处理收到的字节串数据。下面一步步给你解决:

第一步:修正Arduino代码

你的原代码里少了关键的串口初始化,而且按键输入方式可以优化得更稳定。试试这个修改后的版本:

int button1 = 0; 
int button2 = 0; 

void setup() {
  // 使用内部上拉输入,不需要外接下拉电阻,按键按下时引脚为LOW
  pinMode(2, INPUT_PULLUP);  
  pinMode(3, INPUT_PULLUP);
  // 初始化串口,波特率设为9600(要和Python代码一致)
  Serial.begin(9600);  
}

void loop() {
  button1 = digitalRead(2);
  button2 = digitalRead(3);
  
  // 因为是上拉输入,按键按下时状态为LOW,这里做判断
  if (button1 == LOW) {
    Serial.println(13);
    delay(200);  // 加200ms延迟,防止按键抖动导致多次触发
  } else if (button2 == LOW) {
    Serial.println(14);
    delay(200);
  }
}

为什么这么改?

  • 必须加Serial.begin(9600):否则Arduino的串口根本没开启,数据发不出去
  • 用INPUT_PULLUP:避免引脚悬空导致的误触发,按键接线只需要把一端接引脚,另一端接地就行,更简单

第二步:修改Python代码,正确解析串口数据

你之前读到b'13'是因为Arduino用Serial.println发送的是带换行和回车的字节串(比如b'13\r\n'),直接判断字符串肯定不匹配。下面是能正常工作的Python代码:

import serial
import pyautogui

# 替换成你的串口端口:Windows是COM3/COM4等,Linux是/dev/ttyACM0,Mac是/dev/tty.usbmodemXXXX
ser = serial.Serial('COM3', 9600, timeout=1)

while True:
    # 读取一行串口数据(包含换行符)
    raw_data = ser.readline()
    if raw_data:
        # 1. 把字节串解码成UTF-8字符串
        # 2. 用strip()去掉首尾的换行、回车、空格等空白字符
        clean_data = raw_data.decode('utf-8').strip()
        print(f"收到数据: {clean_data}")
        
        # 现在判断干净的字符串就生效了
        if clean_data == '13':
            pyautogui.press('f13')
            print("已触发F13按键")
        elif clean_data == '14':
            pyautogui.press('f14')
            print("已触发F14按键")

必要的准备工作

  1. 安装依赖库:打开命令行运行
    pip install pyserial pyautogui
    
  2. 确认串口端口:在Arduino IDE的「工具」→「端口」里查看你的Arduino对应的端口,替换到Python代码里
  3. 上传Arduino代码后,关闭Arduino的串口监视器,再运行Python脚本(否则串口会被占用,Python无法打开)

这样修改后,按下Arduino的按键,Python就能正确识别并触发对应的F13/F14按键啦!

内容的提问来源于stack exchange,提问作者Davide Santoni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:30:48