質問

私は現在、小さなバーのために書いたJava/MySQL POSシステムをテストしており、現金の引き分けに問題があります。

Cash Drawerには、USB->シリアルボックスを介してRJ11プラグが接続されており、デバイスにデータを書き込むと、ドローが開いています。

RXTXに問題がありますが、それが私のコード、ライブラリ、またはデバイスのドライバーかどうかはわかりませんでしたか?

理想的には、ユーザーがシステムにログインしてログアウトしたときに閉じたときに接続を作成したいのですが、今のところ、コードは接続を開き、データを書き、販売が鳴ったときにクローズします(保存ボタンを押すことと引き出しの開口部を押すまでに1〜2秒の遅延がありますが、これはイライラします)。

アプリが最初に起動すると、引き出しは数回の販売で正常に機能します(パターンを特定していません)が、動作を停止します。それは、Nosuchport、Portinuse、または単なるアクセスデニージなメッセージのいずれかを混合して発生するさまざまな例外を示しています。通常、アプリを再起動してUSBを切断/再接続すると、さらに数回の売り上げで再び機能します。

Hyperterminalを使用してデバイスに接続できます。問題なく一貫して動作します。

Javaコード:

public static void openTill() {
    try {
    portId = (CommPortIdentifier) CommPortIdentifier.getPortIdentifier("COM3");
    serialPort = (SerialPort) portId.open("DRAWER_PORT", 2000);

    outputStream = serialPort.getOutputStream();

    serialPort.setSerialPortParams(2400, SerialPort.DATABITS_8,
        SerialPort.STOPBITS_1,
        SerialPort.PARITY_NONE);

    serialPort.setRTS(false);
    serialPort.setInputBufferSize(8192);
    serialPort.setOutputBufferSize(8192);
    serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_XONXOFF_IN |     
        SerialPort.FLOWCONTROL_XONXOFF_OUT);

    outputStream.write("k".getBytes());
    outputStream.close();
    outputStream = null;

    serialPort.close();
    serialPort = null;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

いくつかの異なる設定を試してみましたが、Hyperterminalが使用する設定(Portmonをチェックする)ができる限り近くに模倣しようとしましたが、まだ動作していません。

どんな提案でも大歓迎です!

ありがとう、ライアン。

役に立ちましたか?

解決

コードに問題があることはありませんが、デバッグのためのいくつかの出発点を提案できます。

  • Sun's(errr .. oracle's)javax.comm実装で同じコードを試してください。 Windowsバージョンはサイトからダウンロードできなくなりましたが、他の場所ではまだ見つけることができます。最終セットアップでこの実装を使用したくない場合でも、問題を見つけるのに役立つかもしれません。などの他の選択肢もあります Serialio.

  • 使用する com0com 仮想comポートをインストールします。ロギングを有効にします(最後の質問を参照してください readme.txtファイル)。ハイパーターミナルを使用するときに得られるログでコードを使用するときのログを比較し、違いを探します。

  • 別のシリアル - > USBコンバーターを試してください。私の経験では、これらの多くはRS232を適切に実装していないか、バグがたくさんあります。

編集:

これが実際にRXTXバグであることがわかったが、何らかの理由で別のjavax.commの実装に切り替えたくない(これが起こるのを見た:-)ここに役立つかもしれないいくつかの追加のヒントがあります(私は試してみてくださいとにかく上記の提案は最初)::

  • 呼びかけです setInputBufferSize, setOutputBufferSize 必要?それらを削除してみてください。デバイスは実際にxon/xoffフロー制御を使用していますか?そうでない場合は、フロー制御をなしに設定してみてください。デバイスはRTSを無効にする必要がありますか?そうでない場合は、この行も削除します。また、出力ストリームを開く前に、シリアルポートParamsを設定してみてください。もちろん、これは違いはありませんが、RXTXバグをトリガーしている可能性があります。

  • 問題は、順番のポートを数回開閉して閉鎖することに関連していますか?ポートを常に開いたままにしておくことができます。各販売で、ただしてください:

    outputStream.write("k".getBytes());
    outputStream.flush();
    

    問題がまだ再現しているかどうかを確認します。

他のヒント

JSSCを試してみる必要があります。 http://code.google.com/p/java-simple-serial-connector/ (Serialioとは異なり無料です)。

私には多くの問題がありました(これはそれらの1つでした)RXTXシリアルおよびUSBシリアルコンバーターもあるため、RXTXからこれに移行しただけで、非常にうまく機能します!システムの自動検出を備えたWindows、Linux、Mac、Solaris用の.jarにdllを統合しました。

最新の公式バージョンはタイムアウトをサポートしていませんが、開発者に連絡し、タイムアウトが非常に迅速に実装されたJARバージョンを送信してくれました!

移行は本当にシンプルでしたが、今でははるかにうまく機能しています(:

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top