2

私は、電気医療機器(グルコメーター)と接続する必要がある GPRS モデム JAVA (J2ME)プログラマブルのアプリケーションを作成する必要があります。

デバイスのシリアル ポートに入力バッファと出力バッファがあります。

アプリケーションが起動すると、シリアル ポートでリッスンし、グルコメーターから 10 進コード "5" を含む 1 バイトを受信します。これは、ASCII テーブル、問い合わせのシンボルに対応し、15 秒後にバイト "4" を取得します。 End of Transmission に相当します。

グルコメーターからデータを受信するには、バイト「6」に対応するACK 信号(確認応答)を送信する必要があります。私は次のフォームを試しました:

outBuffer.write("ACK\r\n".getBytes()); //first without setting the charset and after I trying to set all the charset.

次のようなバイトバッファを送信しようとしました:

byte[] bSend = new byte[] { 6 }; outBuffer.write(bSend); //(I tried also with the byte 10 (LF) and 13 (CR)).

その結果、データを受信できず、周期的に取得できますが、値は 5 と 4 のみです。

ACKメッセージを送信すると、シリアルポート(シリアルモニターなど)と通信できるすべてのソフトウェアで、グルコメーターからデータを正しく受信します。

私の問題は、Java の ACK コーディングの値によるものだと思います。誰かが解決策を示すことができますか?

4

2 に答える 2

1

これは ASCII 制御文字を使用して通信を行うかなり低レベルのインターフェースのように思われるため、これらのバイト値を逐語的に、改行などの余分なものなしで送信する必要があると思います。この意味は

byte[] bSend = new byte[] { 6 }; 
outBuffer.write(bSend);

正しいアプローチです。さて、このプロトコルはASTM E1381によく似ているので、ここで確認したところ、段落6.1.2があなたの問題に関連している可能性があります:

メーターが確立フェーズを開始すると、メーターは最初に文字を送信して、コンピューターが接続されているかどうかを判断します<ENQ>。コンピュータが 15 秒以内に文字を送信して応答した場合<ACK> 、メーターはデータ転送モードに進みます。コンピュータが 15 秒以内に<NAK>文字で応答した場合、メーターは を送信 し、コンピュータから文字<EOT>を探すことによって、リモート コマンド モードに入ろうとし <ENQ>ます。「セクション 6.2 リモート コマンド モード プロトコル」も参照してください。または文字<ENQ>以外のメーターへの 15 秒以内の応答 により、メーターは を送信し、1 秒遅れてから別の を送信します。コンピュータが 15 秒以内に応答しない場合、メーターは<ACK><NAK><EOT><ENQ><EOT>、1 秒遅延してから別の秒を送信<ENQ>し、コンピューターからの応答を再び待ちます。注: を送信してから 1 秒後に<ENQ>、メーターが低電力モードに入る場合があります。<ACK>そのため、コンピュータから送信された最初のメッセージが正しく読み取られない可能性があります。この場合、メーターは で応答し、<EOT>1 秒遅れてから別の を送信します<ENQ>

私を強調してください、それが起こっていることだと思います。したがって、別の ENQ を送信してデータ転送モードにする必要があります。

于 2013-03-11T10:50:13.193 に答える
0

バイト bSend=(byte)0x6; である必要があります。outBuffer.write(bSend);

于 2013-05-08T04:49:49.297 に答える