【问题标题】:Not able to read InputStream from RS232 Bluetooth module无法从 RS232 蓝牙模块读取 InputStream
【发布时间】:2017-07-07 16:31:28
【问题描述】:

我正在尝试从连接到蓝牙模块的称重机中读取值(M143 RS232 Bluetooth Serial AdaptereBay 购买)。我能够连接设备并且得到Socket 对象。但是InputStream 是阻塞并且无法从流中读取数据(inputstream.available() 始终返回零)。当我向OutputStream 写入内容时没有问题。我尝试使用 BufferedReader 但没有更改。以下是我尝试过的代码。

InputStream inputStream = socket.getInputStream();
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder total = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
   total.append(line).append('\n');
}
//code is not reaching here it is blocking in the while loop
if(outputStream!=null){
  outputStream.flush();
  outputStream.close();
}

【问题讨论】:

  • 可能您的设备没有发送“线路”。什么是尝试使用 r.read() 读取单个字节?也许设备协议中有一些特殊的东西......
  • 我也试过 r.read(),但同样的事情正在发生
  • @PeterMmm为什么会这样?
  • 可能是因为设备没有发送任何数据?
  • 我尝试通过连接RS232 to USB converter将称重机连接到PC并使用RS232 Data Logger软件正确打印称重机的值。

标签: android bluetooth serial-port


【解决方案1】:

您是否在不同线程中打开套接字以进行连接。应该有3个线程用于连接。这对非蓝牙 LE 有效。 Bluetooth Connectitivty

  1. 连接线程
  2. 接受话题
  3. 连接线程

如果您使用这些线程,您将能够使用连接线程获取数据,并且您可以使用处理程序、回调或广播接收器将数据传递给主线程。我无缝地使用了这三个。

如果您想检查它是否有效,请从 Play 商店下载蓝牙终端应用程序。它完全使用 Threads 和 Handler 来显示数据。您也可以找到蓝牙终端源代码之一。其中之一是开源的。

对于 BLE,您可以试试这个link。有与指南相关的工作样本。 如果您想确保您的 BT 设备正常工作,请下载 BT 终端程序 pc 或/和 Android 并测试您的设备。

【讨论】:

  • 感谢您的回复。还是不显示体重,请问有什么命令可以显示数据吗?
  • 什么时候不显示?使用线程或使用蓝牙终端应用程序时?
  • 你应该检查你的设备。市场上的所有应用程序都使用谷歌提供的几乎相同的代码来获取数据。在线程中打开套接字并打开输入流并使用处理程序来获取和显示数据。如果您在 Google 页面上使用蓝牙终端或消息应用程序并在 2 台设备上试用,您会发现它们都可以正常工作。您可能需要发送一条消息来启动您的设备以发送数据。在我们的项目中,我们发送 3 位消息来开始或停止蓝牙设备的嗡嗡声。
【解决方案2】:

请务必注意,.read() 或 .readline() 仅在有换行符或 EOF、文件结尾时才会停止读取。

但是,除非套接字传输完成,否则套接字连接没有 EOF。

所以你可以做以下两种情况:

1)在每次数据传输后更改另一端(在您的情况下为称重机)添加 \n 或 \r 以让 Android 端知道发送了一组完整的数据。 这保持了套接字连接的好处。 你可以这样做

while ((line = r.readLine()) != null) {
    //do what you want to do with line
    //... you dont need string builder in this case
}

2) 每次数据传输后暂停来自另一端的每个连接。不建议这样做,因为在每次数据传输后切断时,它不再是套接字传输。此外,它可能会导致 TIME_WAIT 并阻碍进一步的连接。

当我站在你的立场上时,我能够做第一个案例来解决我的问题。

【讨论】:

    【解决方案3】:

    在读取InputStream 时执行阻塞是因为如果没有来自Socket 的字节,现有线程将等待来自Socket 的字节。

    【讨论】:

    • 即使有来自套接字的字节,由于我所说的,您在使用 readline() 时的代码在读取这些字节后也会被阻塞。
    【解决方案4】:

    通过蓝牙与其他安卓设备或微控制器如ArduinoAndroid Smooth Bluetooth进行通信

    // 该线程在与远程设备连接期间运行。

    // 它处理所有传入和传出的传输。

    private class ConnectedThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;
    
        public ConnectedThread(BluetoothSocket socket, String socketType) {
            mmSocket = socket;
            InputStream tmpIn = null;
            OutputStream tmpOut = null;
    
            // Get the BluetoothSocket input and output streams
            try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) { }
    
            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 2014-10-16
      • 2016-03-30
      • 1970-01-01
      • 2012-08-30
      相关资源
      最近更新 更多