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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:35:25