JSSC串行连接及其流量控制

时间:2013-10-21 06:57:44

标签: serial-port buffer flow-control jssc

我需要使用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。

1 个答案:

答案 0 :(得分:1)

最后问题不是jssc库而是usb到串口适配器。使用基于FTDI芯片的适配器更改它可以工作。 (而且似乎也是最后一个驱动程序发布的Prolific适配器工作)。