我正在尝试将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();,这就是代码冻结的地方。
我还尝试在调用write方法后添加arduinoOutputStream.flush();,但这也没有帮助,因为代码甚至在到达该行之前就冻结了。
任何帮助都将不胜感激。
更新:
我尝试使用移除蓝牙模块,并使用USB数据线代替Arduino,它工作得很好。我想我可能需要对蓝牙模块进行一些设置。
它是一个HC-06蓝牙模块。这是我从https://www.amazon.ca/JMT-Wireless-Bluetooth-Serial-Arduino/dp/B00HXAE0PQ/那里得到的
我要做的唯一一件事就是在我的windows10电脑上管理蓝牙设备,然后点击配对。它说它下面是配对的,所以我不确定是什么问题。
再次更新:
我尝试使用Arduino IDE中的串行监视器向蓝牙模块发送数据,整个IDE完全死机了。我可以关闭它的唯一方法是在任务管理器中杀死进程。我很确定Arduino IDE也有和我一样的问题,所以肯定是蓝牙芯片的问题,而不是我的代码本身。
发布于 2017-03-25 15:07:00
事实证明我的想法完全错了。我使用蓝牙连接要好得多,而不是试图把蓝牙芯片当作COM端口。我想我只是专注于这一点,因为我在Arduino就已经习惯了。
我使用了java的bluecove库,现在它工作得很好!
https://stackoverflow.com/questions/43012425
复制相似问题