У меня есть малиновое пи, соединенный с устройством последовательного порта с помощью 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
Что является проблемой? Какие параметры порта следует изменить?