• 締切済み

C++でシリアルの受信処理の作成

C++でシリアルの受信処理を作成しようと思っているのですが データの受信とデータの解析を別スレッドに分けようと思っています。 データの受信スレッドでバッファにデータを受け取って行き、 データの解析スレッドでバッファのデータを解析しようと思っています。 データの受信スレッドについては作成できるのですが、解析について、受信スレッド側で データを受信しつつ、解析スレッドでデータの解析を行う解析スレッドはどのように 作れば良いでしょうか? もう少し具体的に、解析のスタート、解析するデータサイズ、解析のストップは どう指定すれば良いでしょうか

みんなの回答

回答No.1

シリアル通信は、基本「データの垂れ流し」ですから、どこかで「データを区切る」必要が出て来ます。 その為、送信側で「ここが区切りです」と言うデータを送信する必要があります。 例えば、データをテキスト(可読文字のみ)で送るなら、改行を「区切り」として送るとか。 例えば、データをバイナリで送るなら、レコードの初めにレコード長とマーカーを送って、レコードの最後にCRCとマーカーを送るとか。 このように、データに「区切り」を入れて「レコード単位」で送信するようにしないと、受信データを解析する事は出来ません。 受信ルーチンでは、垂れ流されてくるデータを受け取りつつ「データの区切りごと」に、解析スレッドに「1レコード分溜まったから解析しろ」と、シグナルを送ります。 解析ルーチンでは、シグナルを受け取ったら、受信ルーチンに対し「1レコード分くれ」と要求し、受け取ったレコードを解析します。 受信ルーチンでは「レコードの整合性」をチェックして、不整合があるなら「応答としてNAKを返す」などして、送信側に「受信失敗」を送り返します。 いずれにせよ「データ化け」や「データ欠落」に配慮したルーチンにしないと、解析は上手く行きません。

関連するQ&A