如何在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
相关产品推荐
相关产品推荐

