2016-08-11 118 views
0

我有使用USB串行电缆HL-340(PL-2303还测试)连接到串行端口器件树莓PI奇怪的结果

的装置需要1字节命令,并应与2字节回复(OK,这是非常简单的设备,很容易学习的协议:))

我的代码:

[...] 
     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个字节的回复,现在收到回复之后,打印缓冲区中的所有字节以查看这是垃圾数据(特殊的非打印字符)还是有效数据。这将给你更多的见解和下一步行动项目进一步进展。