为什么我的蓝牙会保留未读取的字节?

时间:2019-05-13 16:51:23

标签: bluetooth arduino software-serial

在用于通过HC-06蓝牙模块发送字节的Arduino代码中,我构建了一个简单的程序,该程序每次按下按钮时都会发送数据。方法如下:

// This is defined already for my Bluetooth device's pin locations on my board
// and baud rate at which it will run. Here's only the necessary part of my code.

SoftwareSerial.print("Hello World!");

在我的Android应用程序上,当蓝牙设备与之配对时,我放置了一个监听器,用于通过蓝牙设备传入的数据。一切正常。当我从Arduino代码触发该方法时,字节将在发送"Hello World!"的Android代码中进行处理。但是,当我的蓝牙设备未与我的Android设备配对并且仍触发该方法时,字节的实例数稍后会在再次与之配对时发送到我的Android应用程序,但不应该这样做,只能发送新的数据实例。

这是一个例子:

现在两个设备都已配对,蓝牙设备和Arduino都已配对。我触发了将"Hello World!"发送到Android应用程序的方法,并且效果很好。输出仅为"Hello World!",这意味着Android应用程序已成功从配对的蓝牙设备读取传入的数据。但是,当我取消设备配对时,例如触发该方法4次,但是这次Bluetooth设备没有字节的目的地,并且出了点问题。当我再次配对并触发该方法时。我正在获得5个字节的实例。输出如下:"Hello World!Hello World!Hello World!Hello World!Hello World!"。在蓝牙设备未与任何其他设备配对时发送数据的原因是为了模仿有关数据是否到达的任何问题。

以下是我能想到的两个最佳解决方案(这可能对其他人有用):


#1 我试图在配对时从Android应用程序中的蓝牙设备读取数据:

StringBuilder builder = new StringBuilder();
byte[] bData = new byte[1024];

while(mmInputStream.available() > 0) {
    int read = mmInputStream.read(bData);
    builder.append(new String(bData, 0, read, StandardCharsets.UTF_8));
}

这段代码也用于读取任何新的传入数据,但是,它没有帮助,它仅“删除”了两个字节。我可以设置一个线程在n秒钟内侦听任何现有数据,但由于它很愚蠢而选择不侦听。那不是重点。


#2 我被建议实施一种方法,通过特定的AT命令确定蓝牙设备是否配对,从而确定其LED二极管如何工作。 (因为我使用的是HC-06),但我仍然担心发送数据时可能会出现临时连接问题。


为什么会发生这种情况,对此有什么解决办法吗?

0 个答案:

没有答案