我需要使用Jssc库将长文本发送到串行打印机。经过一些我得到一个完整的缓冲区错误,所以我认为它可以是流量控制设置,因为对于较小的传输一切正常。 打印机可以使用XON / XOFF流量控制配置或CTS / RTS硬件信号。
软件流量控制
我打开端口的jssc代码如下:
serialPort.openPort();
serialPort.setParams(baud, data, stop, SerialPort.PARITY_NONE);
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_XONXOFF_IN | SerialPort.FLOWCONTROL_XONXOFF_OUT);
这仅适用于小文本输出,对于较长的输出,打印机会抛出完整的缓冲区错误。
硬件流量控制
我还尝试将打印机切换到cts / rts流控制并将我的代码更改为:
serialPort.openPort();
serialPort.setParams(baud, data, stop, SerialPort.PARITY_NONE, true, false);
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT);
但没有任何改变。我仍然得到长输出的缓冲区错误。
如果我的打印机在填充缓冲区之前正确发送了XOFF字符或CTS信号,那么我可以用COM监视器检查它是否正常工作!
最后我尝试手动管理输出流,在CTS信号关闭时停止它(使用事件处理程序),这样一切都可以使用长输出....但这不是flowcontrol应该自动执行的操作?
手动硬件流量控制测试
这是我的手动硬件流控制测试。 它使用canSend boolean var来控制输出流。
private boolean canSend=true;
public void openPort(
serialPort.openPort();
serialPort.setParams(baud, data, stop, SerialPort.PARITY_NONE, true, false);
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
serialPort.addEventListener(new SerialPortReader(), SerialPort.MASK_CTS);
canSend=true;
}
public void write(byte[] content) throws Exception {
ByteArrayInputStream b= new ByteArrayInputStream (content);
byte[] bytes =new byte[OUT_BUFFER_SIZE];
int byteread=0;
while ((byteread=b.read(bytes, 0, bytes.length)) >= 0) {
if(byteread>0){
while(!canSend){
Thread.sleep(CTS_WAIT);
}
if(byteread<bytes.length){
byte[] tocopy=new byte[byteread];
System.arraycopy(bytes, 0, tocopy, 0, byteread);
serialPort.writeBytes(tocopy);
}else{
serialPort.writeBytes(bytes);
}
}
}
}
private class SerialPortReader implements SerialPortEventListener {
public void serialEvent(SerialPortEvent event) {
if(event.isCTS()){
canSend=event.getEventValue() == 1;
}
}
}
似乎完全忽略了flowcontrol设置。 什么可以?是Windows驱动程序错误的jssc错误吗?
我还尝试使用getFlowControlMode()检查它,并且我正确地获得了硬件流控制测试的值3。
答案 0 :(得分:1)
最后问题不是jssc库而是usb到串口适配器。使用基于FTDI芯片的适配器更改它可以工作。 (而且似乎也是最后一个驱动程序发布的Prolific适配器工作)。