Java中使用Raspberry Pi 3的蓝牙:接收大量数据时,我的BufferedReader会挂起



我在我的Raspberry Pi 3上写了一个简单的程序。通过使用蓝牙的Android片剂。

在平板电脑一侧,我有一些滑块(例如:音量(,每当更改时,它们都会通过蓝牙发送数据。平板电脑充当服务器,代码看起来像:

final BluetoothSocket clientSocket = bluetoothServerSocket.accept();
InputStream is = clientSocket.getInputStream();
OutputStream os = clientSocket.getOutputStream();
bufIn = new BufferedReader( new InputStreamReader( is ) );
bufOut = new BufferedWriter( new OutputStreamWriter( os ) );

,每当我想发送数据时,我都会在另一个线程中进行以下操作:

bufOut.write("<message>blabla</message>");
bufOut.flush();

但是,如果我疯狂地移动滑块,则该程序在bufOut.flush();的某个时候停止。我对此的想法是,RPI上的插座的另一端已满,并防止平板电脑发送任何更多数据。

所以,在RPI上,我正在使用BlueCove库和我看起来像这样的代码:

connection = (StreamConnection) Connector.open(serviceInDevice);
is = connection.openInputStream();
os = connection.openOutputStream();
bufIn = new BufferedReader(new InputStreamReader(is));
bufOut = new BufferedWriter(new OutputStreamWriter(os));

,对于接收数据,我在另一个线程上进行以下操作:

while(true) {
    String readLine = bufIn.readLine();
    //Process data...
}

在滑块狂热之后,当平板电脑挂在其flush()功能上时,该程序挂在readLine()上。我尝试使用另一个线程并执行System.out.println(bufIn.ready())来测试bufIn的状态,但是该线程也挂在此行上。我还尝试通过调用is.available()来异步测试InputStream is的状态,但是返回值始终为0。

我尝试将BufferedReadersBufferedWriters更改为直接操纵OutputStreamInputStream,但问题仍然存在。

在发送零件上添加睡眠以避免超时的选择,因为我还必须将音频数据发送到RPI,并且基本上很多。

RPI上有关于蓝牙的已知问题,还是我缺少某些内容?

谢谢

好吧,我找到了我的RPI蓝牙冻结的原因。答案可能对他人并不有用,但是我正在使用VNC来查看计算机上覆盆子的输出,并且一旦我停止使用VNC,问题就消失了。因此,如果有人想知道,不建议在RPI上同时使用VNC和蓝牙:P

最新更新