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 シグナルがオフのときに (イベント ハンドラーを使用して) 停止しようとしました。
手動ハードウェア フロー制御テスト
これは私の手動ハードウェア フロー制御テストです。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;
}
}
}
フロー制御の設定が完全に無視されているようです。何ができますか?それはjsscエラーですか、Windowsドライバーエラーですか?
また、getFlowControlMode() でチェックしようとすると、ハードウェア フロー制御テストの値 3 が正しく取得されます。