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

Python读取Arduino Mega串口数字与字母失败问题排查

4×4键盘-Arduino-Python串口通信故障修复

核心问题

  1. 字节类型不匹配:Python的serial.read()返回字节对象(如b'1'),直接和字符串"1"比较永远不相等。
  2. 换行符干扰: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:55:48