Python读取Arduino Mega串口数字与字母失败问题排查
4×4键盘-Arduino-Python串口通信故障修复
核心问题
- 字节类型不匹配:Python的
serial.read()返回字节对象(如b'1'),直接和字符串"1"比较永远不相等。 - 换行符干扰:Arduino的
Serial.println()会在发送的字符后附加\r\n,导致Python读取的内容包含多余字符。
修复后的Python代码
import serial import time import keyboard arduino = serial.Serial(port='COM9', baudrate=9600, timeout=.1) time.sleep(2) while True: # 读取一行数据,解码为字符串并去除首尾空白(含换行/回车) key = arduino.readline().decode('utf-8').strip() if key: print(key) if key == "1": keyboard.send("e")
可选的Arduino代码优化
如果不需要换行符,可以修改Arduino代码中的发送语句,仅发送单个字符:
#include <Keypad.h> const int ROW_NUM = 4; const int COLUMN_NUM = 4; char keys[ROW_NUM][COLUMN_NUM] = { {'1','2','3', 'A'}, {'4','5','6', 'B'}, {'7','8','9', 'C'}, {'*','0','#', 'D'} }; byte pin_rows[ROW_NUM] = {42, 40, 38, 36}; byte pin_column[COLUMN_NUM] = {34, 32, 30, 28}; Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM ); void setup(){ Serial.begin(9600); } void loop(){ char key = keypad.getKey(); if (key){ Serial.print(key); // 替换println为print,仅发送单个字符 } }
对应的Python简化代码:
import serial import time import keyboard arduino = serial.Serial(port='COM9', baudrate=9600, timeout=.1) time.sleep(2) while True: key_byte = arduino.read() if key_byte: key = key_byte.decode('utf-8') print(key) if key == "1": keyboard.send("e")
额外排查要点
- 确认COM端口号:在Arduino IDE的「工具」→「端口」中查看当前连接的端口,避免端口错误。
- 关闭串口监视器:同一串口不能同时被Arduino IDE和Python程序占用,否则Python无法读取数据。
- 匹配串口参数:确保Python的波特率、超时设置与Arduino一致。
内容的提问来源于stack exchange,提问作者R Baker
相关产品推荐
相关产品推荐

