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

如何在Arduino中提取Python串口发送的机器人控制数据?

Arduino端串口数据解析方案

首先需要调整Python端的发送逻辑——当前代码直接发送整数列表,Arduino接收的是二进制字节,并非你看到的[1,20,45,30]格式字符串。修改Python发送逻辑,把数据转成逗号分隔+换行结尾的字符串,能让Arduino更方便解析:

修改Python发送代码

将原代码中的ser.write(Data)和ser.write(IKData)替换为以下内容:

# 发送正运动学数据
data_str = ','.join(map(str, Data)) + '\n'
ser.write(data_str.encode())

# 发送逆运动学数据(逻辑一致)
ik_data_str = ','.join(map(str, IKData)) + '\n'
ser.write(ik_data_str.encode())

同时在初始化串口时明确波特率(需和Arduino端保持一致):

ser = serial.Serial("COM6", 9600)  # 添加波特率参数

Arduino端解析代码

以下是完整的Arduino示例代码,实现数值提取与分类处理:

void setup() {
  Serial.begin(9600);  // 与Python端波特率保持一致
}

void loop() {
  if (Serial.available() > 0) {
    // 读取完整一行数据(以换行符为结束标记)
    String inputStr = Serial.readStringUntil('\n');
    inputStr.trim();  // 移除首尾多余的空格、换行符
    
    int values[4];  // 存储提取出的4个数值
    int index = 0;
    // 按逗号分割字符串
    char* token = strtok((char*)inputStr.c_str(), ",");
    
    // 逐个将分割后的字符串转为整数
    while (token != NULL && index < 4) {
      values[index] = atoi(token);
      index++;
      token = strtok(NULL, ",");
    }
    
    // 确保提取到完整的4个数值后,按类型处理
    if (index == 4) {
      switch(values[0]) {
        case 1:
          // 正运动学数据:values[1]=valX, values[2]=valY, values[3]=valZ
          Serial.print("正运动学参数:");
          Serial.print("X="); Serial.print(values[1]);
          Serial.print(", Y="); Serial.print(values[2]);
          Serial.print(", Z="); Serial.println(values[3]);
          // 此处添加机器人关节控制逻辑
          break;
        case 2:
          // 逆运动学数据:values[1]=h, values[2]=joint2, values[3]=joint3
          Serial.print("逆运动学参数:");
          Serial.print("H="); Serial.print(values[1]);
          Serial.print(", Joint2="); Serial.print(values[2]);
          Serial.print(", Joint3="); Serial.println(values[3]);
          // 此处添加机器人关节控制逻辑
          break;
        default:
          Serial.println("未知数据类型");
          break;
      }
    } else {
      Serial.println("数据格式不完整");
    }
  }
}

核心解析逻辑说明

  • 整行读取:通过Serial.readStringUntil('\n')确保拿到完整的一组数据,避免读取片段化内容。
  • 字符串分割:利用strtok函数按逗号拆分字符串,将每个片段转换为整数存入数组。
  • 类型区分:通过第一个数值(1或2)判断是正/逆运动学数据,分别处理对应参数。

内容的提问来源于stack exchange,提问作者Finn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:11:18