2017-03-25 4 views
0

Ich versuche, einige Bytes von Java-Code an ein Bluetooth-Modul zu senden, das mit einem Arduino verbunden ist. Hier ist mein Code.Fehler beim Schreiben auf den seriellen Port mit der Java RXTX-Bibliothek

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(); 
     } 
    } 
} 

Die init() scheint richtig zu arbeiten und die Verbindung mit dem Bluetooth-Modul. Das Problem ist, dass der Aufruf an arduinoOutputStream.write() auf unbestimmte Zeit blockiert. Ich kann auch sagen, dass die Bytes nicht gesendet wurden, weil der Arduino nichts tut. Es wurden jedoch keine Ausnahmen ausgelöst.

Ich habe irgendwo gelesen, dass es sein könnte, weil das Arduino zurückgesetzt wird und Zeit braucht, bevor es bereit ist, Daten zu empfangen, also habe ich Thread.sleep(10000); vor dem Schreiben an den Port versucht, aber das änderte nichts.

Ich habe auch einen Debugger, um herauszufinden, wo genau wurde der Code blockiert und ich verfolgen ihn auf diese Zeilen aus dem write (byte []) Methode von RXTXPort.class in der RXTX Bibliothek:

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

Von dem, was ich sammeln kann, wird waitForTheNativeCodeSilly(); aufgerufen, bevor die Bytes tatsächlich in der nächsten Zeile gesendet werden, und das ist, wo der Code einfriert.

Ich habe auch versucht, arduinoOutputStream.flush(); nach dem Aufruf der Schreibmethode hinzuzufügen, aber das hat auch nicht geholfen, weil der Code vor dieser Zeile eingefroren wurde sogar erreicht.

Jede Hilfe wäre willkommen.

Update:

Ich habe versucht, das Bluetooth-Modul zu entfernen und mit dem USB-Kabel für den Arduino statt und es funktionierte perfekt. Ich denke, dass ich etwas mit dem Bluetooth-Modul einrichten muss.

Es ist ein HC-06 Bluetooth-Modul. Hier ist, wo ich es von: https://www.amazon.ca/JMT-Wireless-Bluetooth-Serial-Arduino/dp/B00HXAE0PQ/

Das einzige, was ich tun, um es einzurichten, wird Bluetooth-Geräte auf meinem Windows 10 PC verwalten und klicken Sie auf Paar. Es steht darunter gepaart, also bin ich mir nicht sicher, was das Problem ist.

Updates erneut:

Ich hat versucht, Daten zu dem Bluetooth-Modul über den seriellen Monitor in der Arduino IDE und das gesamte IDE vollständig erstarrten zu senden. Der einzige Weg, den ich herunterfahren konnte, war, den Prozess im Task-Manager zu beenden. Ich bin ziemlich sicher, dass die Arduino IDE das gleiche Problem hat, das ich bin, also ist es definitiv etwas mit dem Bluetooth-Chip und nicht mit meinem Code selbst zu tun.

Antwort

0

Es stellte sich heraus, dass ich die völlig falsche Idee hatte. Ich war viel besser dran mit Bluetooth-Verbindung im Gegensatz zu versuchen, den Bluetooth-Chip als COM-Port zu behandeln. Ich glaube, ich war nur darauf fixiert, weil ich von Arduino daran gewöhnt war.

Ich benutzte die BlueCove-Bibliothek für Java und es funktioniert jetzt super!

Verwandte Themen