0

私は Arduino Uno でシリアル通信を使用しようとしており、ライブラリ jSSC-2.6.0 を使用しています。SeriaPortEventリスナーを使用して、シリアル ポート (Arduino) からバイトを受信し、それらをリンク リストに格納しています。

public synchronized void serialEvent(SerialPortEvent serialPortEvent) {
    if (serialPortEvent.isRXCHAR()) { // if we receive data
        if (serialPortEvent.getEventValue() > 0) { // if there is some existent data
            try {
                byte[] bytes = this.serialPort.readBytes(); // reading the bytes received on serial port
                if (bytes != null) {
                    for (byte b : bytes) {
                        this.serialInput.add(b); // adding the bytes to the linked list

                        // *** DEBUGGING *** //
                        System.out.print(String.format("%X ", b));
                    }
                }           
            } catch (SerialPortException e) {
                System.out.println(e);
                e.printStackTrace();
            }
        }
    }

}

ここで、個々のデータをループで送信し、応答を待たない場合、serialEvent は通常、受信したバイトをコンソールに出力します。しかし、リンクされたリストにデータが存在するまで待ってみると、プログラムはループし続け、SerialEvent はバイトを LinkedList に追加しません。受信したバイトを登録することさえありません。

これは機能し、正しいバイトが Arduino によって送信され、SerialEvent によって受信され、コンソールに出力されます。

while(true) {
    t.write((byte) 0x41);
}

しかし、このメソッドは、LinkedList のサイズを返す this.available() でスタックするだけです。実際には、Arduino からデータを受信したり、serialEvent によって受信したりするデータはありません。

public boolean testComm() throws SerialPortException {
    if (!this.serialPort.isOpened()) // if port is not open return false
        return false;

    this.write(SerialCOM.TEST); // SerialCOM.TEST = 0x41

    while (this.available() < 1)
        ; // we wait for a response

    if (this.read() == SerialCOM.SUCCESS)
        return true;
    return false;
}

私はプログラムをデバッグし、時々デバッグしました。プログラムは機能しますが、常に機能するとは限りません。また、プログラムは、リンクリストにバイトがあるかどうかを確認しようとしたときにのみスタックします。つまり、while(available() < 1)です。それ以外の場合、確認しないと、最終的にArduinoからバイトの正しい応答を受け取ります

4

1 に答える 1

0

4時間を無駄にした後、自分で答えを見つけました。readBytes()安全のために、byteCount が 1 で timeOut が 100msのメソッドを使用したほうがよいでしょう。したがって、読み取りメソッドは次のようになります。

    private byte read() throws SerialPortException{
    byte[] temp = null;
    try {
        temp = this.serialPort.readBytes(1, 100);
        if (temp == null) {
            throw new SerialPortException(this.serialPort.getPortName(),
                    "SerialCOM : read()", "Can't read from Serial Port");
        } else {
            return temp[0];
        }
    } catch (SerialPortTimeoutException e) {
        System.out.println(e);
        e.printStackTrace();
    }
    return (Byte) null;
}
于 2015-05-03T13:04:15.710 に答える