Python与Arduino pyserial串口同步及TypeError错误解决
解决Python与Arduino串口通信的TypeError及同步问题
一、修复TypeError错误
错误提示「unicode strings are not supported, please encode to bytes」的核心原因是:pyserial的write()方法仅接受字节类型数据,直接传入字符串会触发类型错误。
修改Python代码的发送逻辑,将所有待发送内容转为字节:
import serial # 初始化串口对象 ser = serial.Serial(port='COM8', baudrate=9600, timeout=.1) # 将字符串编码为字节后发送 ser.write(str(length).encode('UTF-8')) ser.write(b'#') # 直接使用字节字面量更简洁 ser.write(str(radius).encode('UTF-8')) # 若radius为字符串,直接用radius.encode('UTF-8') ser.write(b'/')
二、解决串口同步解析问题
原Arduino代码的解析逻辑存在嵌套混乱、变量未声明等问题,容易导致数据丢包或解析错误,优化后的代码如下:
String inputStringL = ""; // 存储length参数 String inputStringR = ""; // 存储radius参数 bool readingLength = true; // 标记当前读取的参数类型 void loop() { while (Serial.available() > 0) { char inChar = Serial.read(); if (readingLength) { if (inChar == '#') { readingLength = false; // 切换为读取radius模式 } else { inputStringL += inChar; } } else { if (inChar == '/') { // 解析完成,执行电机控制逻辑 int length = inputStringL.toInt(); int radius = inputStringR.toInt(); // 此处添加你的电机控制代码 // 重置缓存,准备下一次接收 inputStringL = ""; inputStringR = ""; readingLength = true; } else { inputStringR += inChar; } } } }
优化说明:
- 增加状态标记
readingLength,明确当前解析的参数类型,避免嵌套逻辑混乱 - 补充变量声明,避免Arduino编译报错
- 解析完成后自动重置缓存和状态,保证下一次数据接收正常
额外注意事项
- 确保Python与Arduino的波特率完全一致(均为9600)
- 发送数据后可添加短暂延时(如
time.sleep(0.1)),避免Arduino来不及处理 - 调试时可在Arduino中添加串口打印,确认解析到的参数是否正确
内容的提问来源于stack exchange,提问作者kikio0_0
相关产品推荐
相关产品推荐

