Jssc 라이브러리를 사용하여 긴 텍스트를 직렬 프린터로 보내야합니다. 몇 가지 문제가 발생하면 전체 버퍼 오류가 발생하므로 흐름 제어 설정이 될 수 있다고 생각합니다. 작은 전송의 경우 모든 것이 작동하기 때문입니다. 프린터는 XON/XOFF 흐름 제어 구성 또는 CTS/RTS 하드웨어 신호를 사용할 수 있습니다.JSSC 직렬 연결 및 해당 흐름 제어
포트를 엽니 다
내 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 신호를 제대로 보내면 제대로 작동하는지 확인합니다.
끝 부분에서 CTS 신호가 꺼져있는 동안 (이벤트 처리기를 사용하여) 출력 스트림을 수동으로 관리하려고했는데이 방법으로 모든 것이 긴 출력에서도 작동합니다 ... 그러나 이것은 flowcontrol이해야하는 것이 아닙니다 자동으로?
설명서 하드웨어 흐름 제어 TEST
이 내 매뉴얼 하드웨어 흐름 제어 테스트입니다. 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의 값을 올바르게 가져옵니다.
어떤 종류의 하드웨어 (직렬 컨트롤러 칩)를 사용하고 있습니까? –
그것은 Prolific PL2303 칩 (의 USB 직렬) – Tobia