如何在Arduino代码中拆分HC-06接收的App Inventor发送的数值
问题根因
你当前收到的59,1,59,2...序列是两个问题共同导致的:
- App Inventor侧将分号、数值拆分为单个字节逐个发送,分号的ASCII码对应十进制59,因此会穿插在数值序列中
- 数值是直接按原始数值字节发送(例如数值1发送的是字节
0x01),而非字符形式的ASCII码(例如字符'1'对应ASCII码49),导致Arduino侧无法按字符串规则解析拆分
修复方案
1. App Inventor侧修改
- 将每个要发送的数值先转换为文本类型,再用分号作为分隔符拼接为完整字符串,格式参考:
1;2;3;4;5;6;(末尾额外加一个分号作为结束标记,避免最后一个数值无法被正确识别) - 选择发送文本/字符串类型的整段数据,不要拆分为单个字节逐个发送,不要直接发送原始数值字节
2. Arduino侧解析代码
使用内置的readStringUntil()方法按分号拆分字符串,再转换为int类型即可:
// 定义接收变量 int A, B, C, D, E, F; // HC-06默认波特率为9600,若修改过波特率请同步修改 const int BAUD_RATE = 9600; void setup() { Serial.begin(BAUD_RATE); } void loop() { // 等待串口接收到完整数据(长度满足6个数值+分隔符的最小长度) if (Serial.available() >= 11) { // 按分号依次读取每个数值并转成int A = Serial.readStringUntil(';').toInt(); B = Serial.readStringUntil(';').toInt(); C = Serial.readStringUntil(';').toInt(); D = Serial.readStringUntil(';').toInt(); E = Serial.readStringUntil(';').toInt(); F = Serial.readStringUntil(';').toInt(); // 测试输出,按需修改为你的业务逻辑 Serial.print("A="); Serial.println(A); Serial.print("B="); Serial.println(B); Serial.print("C="); Serial.println(C); Serial.print("D="); Serial.println(D); Serial.print("E="); Serial.println(E); Serial.print("F="); Serial.println(F); // 清空串口缓存,避免残留数据影响下一次接收 while (Serial.available()) { Serial.read(); } } }
验证注意事项
- 确保HC-06模块的实际波特率和Arduino串口初始化的波特率一致
- 若需要发送大于9的数值,该方案依然可以正常解析,无需额外修改
- 若出现解析错位,可以在两次发送之间加100ms以上的间隔,避免多组数据粘连
内容的提问来源于stack exchange,提问作者André Fabris
相关产品推荐
相关产品推荐

