繁体   English   中英

使用Java RXTX库写入串行端口时遇到问题

[英]Trouble Writing to Serial Port with Java RXTX Library

我正在尝试从Java代码向连接到Arduino的蓝牙模块发送一些字节。 这是我的代码。

import gnu.io.*;

import java.io.IOException;
import java.io.OutputStream;

public class ArduinoSerialWriter {
    private static OutputStream arduinoOutputStream;

    public static void init() throws NoSuchPortException, PortInUseException,
        UnsupportedCommOperationException, IOException {
        SerialPort arduino = (SerialPort) CommPortIdentifier.getPortIdentifier("COM6")
            .open(ArduinoSerialWriter.class.getName(), 2000);
        arduino.setSerialPortParams(9600,
            SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        arduinoOutputStream = arduino.getOutputStream();
    }

    public static void writeToArduino(byte[] bytes) throws IOException {
        arduinoOutputStream.write(bytes);
    }

    public static void main(String[] args) {
        try {
            ArduinoSerialWriter.init();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            arduinoOutputStream.write(new byte[]{(byte) -1, (byte) 90, (byte) 40});
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

init()似乎可以正常工作并连接到蓝牙模块。 问题在于对arduinoOutputStream.write()的调用将无限期地阻塞。 我还可以说字节尚未发送,因为Arduino没有做任何事情。 但是,没有引发异常。

我在某处读到这可能是因为Arduino正在复位并且需要时间才能准备好接收数据,所以我尝试添加Thread.sleep(10000); 在写入端口之前,但这并没有改变。

我还使用了调试器来找出代码到底在哪里阻塞,并通过RXTX库中RXTXPort.class的write(byte [])方法将其跟踪到这些行:

RXTXPort.this.waitForTheNativeCodeSilly();
RXTXPort.this.writeArray(var1, 0, var1.length, RXTXPort.this.monThreadisInterrupted);

据我所知, waitForTheNativeCodeSilly(); 在下一行实际发送字节之前立即调用,这是代码冻结的地方。

我还尝试添加arduinoOutputStream.flush(); 在调用write方法之后,但这无济于事,因为代码甚至在到达该行之前就冻结了。

任何帮助,将不胜感激。

更新:

我试着去掉蓝牙模块,而改用Arduino的USB电缆,效果很好。 我认为可能需要使用蓝牙模块进行设置。

它是HC-06蓝牙模块。 这是我从以下位置获得它的地方: https : //www.amazon.ca/JMT-Wireless-Bluetooth-Serial-Arduino/dp/B00HXAE0PQ/

我要做的唯一设置是管理Windows 10 pc上的蓝牙设备并单击“配对”。 它说成对了,所以我不确定是什么问题。

再次更新:

我尝试使用Arduino IDE中的串行监视器将数据发送到蓝牙模块,整个IDE完全冻结。 我可以关闭它的唯一方法是在任务管理器中终止该进程。 我相当确定Arduino IDE遇到的问题与我相同,因此这绝对与蓝牙芯片有关,而不与我的代码本身有关。

原来我有个完全错误的主意。 使用蓝牙连接比尝试将蓝牙芯片视为COM端口要好得多。 我想我只是对它感兴趣,因为我从Arduino那里就习惯了。

我将bluecove库用于Java,并且现在可以正常工作了!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM