2

私は現在、小さなバー用に作成した Java/MySQL POS システムをテストしており、キャッシュ ドローに問題があります。

キャッシュ ドロワーには、USB->シリアル ボックス経由で接続された RJ11 プラグがあり、デバイスにデータを書き込むと、ドローが開きます。

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

理想的には、ユーザーがシステムにログインすると接続が作成され、ログアウトすると閉じられるようにしたいのですが、今のところ、コードは接続を開き、データを書き込み、販売が開始されると閉じるだけです(保存ボタンを押してから引き出しが開くまでに 1 ~ 2 秒の遅延があり、イライラします)。

アプリが最初に起動したとき、ドロワーはいくつかの売上 (パターンを特定していない) では正常に動作しますが、その後動作を停止します。NoSuchPort、PortInUse、または単純な AccessDenied メッセージのいずれかが混在して、さまざまな例外が発生していることを示しています。通常、アプリを再起動し、USB を切断/再接続すると、さらに数回販売できるようになります。

ハイパーターミナルを使用してデバイスに接続でき、問題なく一貫して動作します。

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();
    }
}

ハイパーターミナルが (PortMon をチェックして) 使用する設定にできる限り近づけようとして、いくつかの異なる設定を試しましたが、まだ機能しません。

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

ありがとう、ライアン。

4

2 に答える 2

1

jSSCを試してみてください:http ://code.google.com/p/java-simple-serial-connector/ (SerialIOとは異なり無料です)。

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

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

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

于 2012-10-05T16:53:27.450 に答える
1

コードに問題は見つかりませんが、デバッグの開始点をいくつか提案できます。

  • Sun (err.. Oracle) の javax.comm 実装で同じコードを試してください。Windows バージョンは同社のサイトからダウンロードできなくなりましたが、他の場所ではまだ見つけることができます。最終的なセットアップでこの実装を使用したくない場合でも、問題を見つけるのに役立つ場合があります。SerialIOなどの他の代替手段もあります。

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

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

編集:

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

  • への呼び出しsetInputBufferSizesetOutputBufferSize必須ですか? それらを削除してみてください。デバイスは実際に XON/XOFF フロー制御を使用していますか? そうでない場合は、フロー制御をなしに設定してみてください。デバイスで RTS を無効にする必要がありますか? そうでない場合は、この行も削除します。また、出力ストリームを開く前に、シリアル ポート パラメータを設定してみてください。もちろん、これは何の違いもありませんが、rxtx バグを引き起こしている可能性があります。

  • 問題は、ポートを数回連続して開閉することに関連していますか? ポートを常に開いたままにしておくことができます。販売ごとに、次のことを行うだけです。

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

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

于 2010-09-23T07:06:53.117 に答える