我的SerialPortEvent不会在连续循环中使用JSSC接收数据



我一直在尝试与我的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,它甚至都不会注册收到的任何字节。

这项工作和正确的字节由Serialevent收到的Arduino发送并打印到控制台:

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

但是此方法只是粘在this.available(),返回linkedlist的大小, 因为实际上没有从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;
}

我已经调试了该程序,有时还会调试,该程序确实有效,但并非总是如此。此外,只有在我尝试检查链接列表中是否有一些字节时,该程序才会被卡住。否则,如果我不检查我最终会收到Arduino的正确响应

浪费了4小时后自己找到了答案。我最好使用readBytes()方法,其字节为1,而超时为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;
}

相关内容

  • 没有找到相关文章

最新更新