如何通过串口将Arduino多路传感器数据发送至Python并正确解析
问题原因
你当前使用Arduino的Serial.write()发送的是原始二进制字节数据,十进制20对应的十六进制值为0x14,因此Python端读到的原始字节就是b'\x14',和预期的数值输出不符。
目标1 实现单传感器数值正确输出
Arduino端修改代码
void setup(){ Serial.begin(9600); // 启动后等待2秒,避免串口初始化阶段丢包 delay(2000); } void loop(){ int sensor1 = 20; // 用print发送ASCII格式数值,加换行作为数据结束标识 Serial.println(sensor1); delay(1000); }
Python端修改代码
import serial ser = serial.Serial("/dev/ttyACM1",9600,timeout=1) while True: # 读取完整一行数据,直到遇到换行符 data_raw = ser.readline() if data_raw: # 字节转字符串,去掉首尾空白符后转整数 sensor_val = int(data_raw.decode().strip()) print(f"data: {sensor_val}")
目标2 实现多路传感器数据同时发送接收
Arduino端修改代码
发送时用空格分隔不同传感器数值,末尾加换行作为结束标识:
void setup(){ Serial.begin(9600); delay(2000); } void loop(){ int sensor1 = 20; int sensor2 = 40; int sensor3 = 60; // 依次发送数值+分隔符,最后一个数值用println加换行 Serial.print(sensor1); Serial.print(" "); Serial.print(sensor2); Serial.print(" "); Serial.println(sensor3); delay(1000); }
Python端修改代码
读到完整行后拆分即可得到所有传感器数值:
import serial ser = serial.Serial("/dev/ttyACM1",9600,timeout=1) while True: data_raw = ser.readline() if data_raw: data_str = data_raw.decode().strip() # 按空格拆分得到所有传感器数值字符串 sensor_list = data_str.split() # 输出要求格式 print(f"data: {' '.join(sensor_list)}")
注意事项
- 串口设备路径
/dev/ttyACM1需要根据你自己的实际设备路径修改,Windows系统下一般是COMx格式 - Arduino连接串口时会自动重启,因此代码中加了2秒启动延迟,避免初始化阶段的数据丢失
- 发送间隔不要太短,避免串口缓冲区溢出丢数据
内容的提问来源于stack exchange,提问作者glenn golez
相关产品推荐
相关产品推荐

