HC-05模块多数据传至Android Studio应用:数据拆分显示问题
解决方案
第一步:优化Arduino的数据发送格式
当前Arduino的发送方式会分多次输出带描述的字符串,还加入了不必要的延迟,导致Android端接收数据时容易出现不完整或混合的情况。建议改为一次性发送三个传感器的数值,用分隔符区分,让数据更易解析。
修改后的Arduino代码:
int LtriggerPin = 13; int LechoPin = 12; int RtriggerPin = 11; int RechoPin = 10; int CtriggerPin = 9; int CechoPin = 8; void setup() { Serial1.begin(9600); pinMode(LtriggerPin, OUTPUT); pinMode(LechoPin, INPUT); pinMode(RtriggerPin, OUTPUT); pinMode(RechoPin, INPUT); pinMode(CtriggerPin, OUTPUT); pinMode(CechoPin, INPUT); } void loop(){ sensor(); delay(500); // 统一控制发送频率,避免数据发送过于频繁 } void sensor() { int durationL, distanceL; int durationR, distanceR; int durationC, distanceC; // 左传感器数据采集 digitalWrite(LtriggerPin, HIGH); delayMicroseconds(10); // 超声波触发仅需10微秒,用微秒延迟更精确 digitalWrite(LtriggerPin, LOW); durationL = pulseIn(LechoPin, HIGH); distanceL = (durationL/2) / 29.1; // 右传感器数据采集 digitalWrite(RtriggerPin, HIGH); delayMicroseconds(10); digitalWrite(RtriggerPin, LOW); durationR = pulseIn(RechoPin, HIGH); distanceR = (durationR/2) / 29.1; // 中传感器数据采集 digitalWrite(CtriggerPin, HIGH); delayMicroseconds(10); digitalWrite(CtriggerPin, LOW); durationC = pulseIn(CechoPin, HIGH); distanceC = (durationC/2) / 29.1; // 一次性发送三个数值,用逗号分隔,换行符作为数据结束标记 Serial1.print(distanceL); Serial1.print(","); Serial1.print(distanceR); Serial1.print(","); Serial1.println(distanceC); }
第二步:修改Android代码解析数据并分别显示
当前Android代码会把所有收到的内容同时设置给三个TextView,需要改成解析拆分数据,将对应数值分配到各自的TextView。
修改后的Android代码:
private Handler handler = new Handler(Looper.getMainLooper()){ @Override public void handleMessage(Message msg){ if(msg.what == MESSAGE_READ){ String readMessage = new String((byte[]) msg.obj, StandardCharsets.UTF_8).trim(); // 去除首尾空白字符 // 按逗号拆分字符串,得到三个传感器的数值 String[] distanceData = readMessage.split(","); // 校验数据完整性,避免因不完整数据导致崩溃 if(distanceData.length == 3){ TvL.setText("Left Sensor " + distanceData[0] + " cm"); TvR.setText("Right Sensor " + distanceData[1] + " cm"); TvC.setText("Center Sensor " + distanceData[2] + " cm"); } } if(msg.what == CONNECTING_STATUS){ if(msg.arg1 == 1) Tv3.setText(getString(R.string.BTConnected) + msg.obj); else Tv3.setText(getString(R.string.BTconnFail)); } } }; @Override public void run() { byte[] buffer = new byte[1024]; int bytes; while (true) { try { bytes = mmInStream.read(buffer); // 直接读取数据,read()会阻塞直到有数据到来 if(bytes > 0) { handler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1, buffer) .sendToTarget(); } } catch (IOException e) { e.printStackTrace(); break; } } }
额外注意事项
- 确保HC-05模块的波特率与Arduino代码中
Serial1.begin(9600)一致,Android蓝牙连接时也要使用相同波特率。 - 如果出现数据解析错误,可在Android端添加日志打印
readMessage内容,检查实际接收的数据格式是否符合预期。
内容的提问来源于stack exchange,提问作者Jezdi
相关产品推荐
相关产品推荐

