2013-10-21 4 views
1

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의 값을 올바르게 가져옵니다.

+0

어떤 종류의 하드웨어 (직렬 컨트롤러 칩)를 사용하고 있습니까? –

+0

그것은 Prolific PL2303 칩 (의 USB 직렬) – Tobia

답변

1

결국 문제는 jssc 라이브러리가 아니고 직렬 어댑터에 대한 usb입니다. FTDI 칩 기반 어댑터로 변경하면 작동합니다. (또한 마지막 드라이버가 Prolific 어댑터 작동을 릴리스 한 것처럼 보입니다.)