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按键")
必要的准备工作
- 安装依赖库:打开命令行运行
pip install pyserial pyautogui - 确认串口端口:在Arduino IDE的「工具」→「端口」里查看你的Arduino对应的端口,替换到Python代码里
- 上传Arduino代码后,关闭Arduino的串口监视器,再运行Python脚本(否则串口会被占用,Python无法打开)
这样修改后,按下Arduino的按键,Python就能正确识别并触发对应的F13/F14按键啦!
内容的提问来源于stack exchange,提问作者Davide Santoni
相关产品推荐
相关产品推荐

