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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:31:05