1

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 が正しく取得されます。

4

1 に答える 1

1

最後に、問題はjsscライブラリではなく、USBからシリアルへのアダプターでした。FTDIチップベースのアダプターで変更すると機能します。(さらに、Prolific アダプターの最後のドライバーのリリースも動作するようです)。

于 2013-12-20T07:36:03.833 に答える