1

enter code hereLinuxのデバイスから、16進文字を含み、「^M」で区切られたストリームを読み取っています。デバイスが詳細情報の準備ができているときはいつでも、文字">"を送信します。ストリームは次のようになります。

^M^M01 02 F3^M00 01 F3 3E^M>"

文字を検出し、その文字に対してアクションを実行する必要があります。">"で区切り、その文字を読み取らせる方法はありますか?

基本的には現在こんな感じです

 01 02 F3
00 01 F3 3E

>別のアクションをトリガーする必要があります。何らかの理由で文字が1つしかない場合は、読み取りバッファーはトリガーされません。私は^Mを否定しています。>何か他のことをする必要があります。

4

1 に答える 1

1

これを行うことはかなり可能です。私は最近、非常によく似たインターフェイスを使用して複数のマウスからの入力を読み取るプロジェクトを作成しました。マウスからのバイナリデータは、ファイルI/Oを介して受信されました。

ここでは、バッファリングされたI/Oは不適切だと思います。バッファリングされたI/Oは、パフォーマンス上の理由から、バッファをいっぱいにしようとします。しかし、あなたのアプリはほとんどの時間を新しいキャラクターを待つことに費やしているようです。一括で読み取っていない場合は、生のバイト読み取りでInputStreamがトリックを実行します。要求された/予想されたバイト数(この場合は1)が受信された直後に返されます。あなたの場合、>文字を読み取った後、次の文字に対して別の1バイトの読み取りを発行します。

介在するキャラクターをどうするかを理解する必要があります。自分と次の文字を処理したら>、そうでない次の文字をどうします>か?

私が自分のアプリで行ったことは、から1バイトを直接読み取ることでしたInputStream。これはブロックされるため、Threadほとんどの時間を待機する別の場所で実行する必要がありました。最初のキャラクターが入ってきたとき、私は(あなたがそうするように)もう少し読んで、それを処理できることを知っていました。この情報をアプリの残りの部分に渡すために、ある種のキューを設定しました。スレッド間通信のために、ある種の同期を行う必要があります。

編集:ポイントを明確にするための複数の小さな編集。これが混乱してしまう場合は申し訳ありません。

于 2010-07-13T17:40:14.727 に答える