2016-08-11 8 views
0

У меня есть малиновое пи, соединенный с устройством последовательного порта с помощью USB-последовательный кабель HL-340 (PL-2303 также протестированы)Странные результаты с использованием JSSC на малиново-пи

Устройство принимает 1 байт команда и должна ответить 2 байта (ок, это очень простое устройство и очень простой в освоении протокол :))

Мой код:

[...] 
     final int[] status = this.serialPort.getLinesStatus (); 
     final StringBuilder sb = new StringBuilder ("Lines Status:"); 
     final String[] name = new String[] { "CTS", "DSR", "RING", "RLSD" }; 
     for (int i = 0; i < status.length; i++) 
      sb.append ((i > 0) ? "," : "").append (name [i]).append (':').append (status [i]); 
     System.out.println (sb.toString ()); 
     System.out.println ("flowcontrol:" + this.serialPort.getFlowControlMode ()); 
     this.serialPort.purgePort (SerialPort.PURGE_RXCLEAR | SerialPort.PURGE_TXCLEAR); 

     synchronized (this) 
     { 
      System.out.println ("1) getInputBufferBytesCount():" + this.serialPort.getInputBufferBytesCount ()); 
      this.serialPort.addEventListener (this); 
      this.serialPort.setEventsMask (SerialPort.MASK_RXCHAR); 
      this.serialPort.writeBytes (COMMAND); 
      wait (3000); // wait 3 seconds for reply 
      this.serialPort.removeEventListener (); 
      System.out.println ("2) getInputBufferBytesCount():" + this.serialPort.getInputBufferBytesCount ()); 
      final int n = this.serialPort.getInputBufferBytesCount (); 
      if (n > 0) 
      { 
      this.serialPort.readBytes (n); // purge garbage data? 
      System.out.println ("3) getInputBufferBytesCount():" + this.serialPort.getInputBufferBytesCount ()); 
      } 
     } 
     if ((this.data == null) && (this.error == null)) 
      this.error = "no response from device"; 
[...] 

и код обратного вызова:

@Override 
public final void serialEvent (final SerialPortEvent event) 
{ 
    synchronized (this) 
    { 
    try 
    { 
     final int val; 
     if (event.isRXCHAR ()) 
     if ((val = event.getEventValue ()) == 2) // the reply is 2 bytes 
      this.data = this.serialPort.readBytes (2); 
     else 
      this.error = "unexpected value:" + val; 
     else 
     this.error = "unexpected event:" + event; 
    } 
    catch (final Throwable x) 
    { 
     this.error = x.toString (); 
    } 
    finally 
    { 
     notify (); 
    } 
    } 
} 

Результатов очень странный и непредсказуемый :(Я ожидаю, что только 2 байта в качестве ответа от устройства, но последовательный порт уведомляет меня гораздо больше данных, доступных для чтения:

Lines Status:CTS:0,DSR:0,RING:0,RLSD:0 
flowcontrol:0 
1) getInputBufferBytesCount():0 
2) getInputBufferBytesCount():544 
3) getInputBufferBytesCount():0 
java.lang.Throwable: unexpected value:192 

или

Lines Status:CTS:0,DSR:0,RING:0,RLSD:0 
flowcontrol:0 
1) getInputBufferBytesCount():0 
2) getInputBufferBytesCount():512 
3) getInputBufferBytesCount():0 
java.lang.Throwable: unexpected value:192 

или

Lines Status:CTS:0,DSR:0,RING:0,RLSD:0 
flowcontrol:0 
1) getInputBufferBytesCount():0 
2) getInputBufferBytesCount():32 
3) getInputBufferBytesCount():0 
java.lang.Throwable: unexpected value:32 

Что является проблемой? Какие параметры порта следует изменить?

ответ

0

Предположим, вы ожидали ответа на 2 байта, теперь после того, как этот ответ был получен, распечатайте все байты в буфере, чтобы узнать, являются ли это нежелательными данными (специальные непечатаемые символы) или действительными данными. Это даст вам более глубокое понимание и следующий элемент действия для дальнейшего прогресса.

 Смежные вопросы

  • Нет связанных вопросов^_^