質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1401閲覧

pc-マイコン間のシリアル通信にて、"マイコンが送信したデータフレーム"をひと固まりとしてPCが受信したい

hachimitu

総合スコア36

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/05/05 10:10

やりたいこと

pc-マイコン間のシリアル通信にて、"マイコンが送信したデータフレーム"をひと固まりとしてPCが受信したい

↓画像はPC側からみた送信データと受信データ
※E0~44をひとつのデータフレームとして受信したいが、なぜか途切れ途切れで受信している
※9600bps
イメージ説明

#コード

C#

1/*データ受信毎に呼び出される*/ 2private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 3{ 4        /*データ受信用構造体定義*/ 5 TxRx_buffer_struct st_rx_buffer = new TxRx_buffer_struct(); 6 st_rx_buffer.buffer = new byte[TXRX_BUUFER_SIZE]; 7 8        /*受信したデータの長さを取得、ここでデータフレームの長さをゲットしたい。※データフレームは可変長*/ 9 Int32 len = serialPort1.BytesToRead; 10 /*受信したデータサイズ分、バッファにセットする*/ 11 for(byte mem_cnt = 0; mem_cnt < len; mem_cnt++ ) 12 { 13 st_rx_buffer.buffer[mem_cnt] = (byte)serialPort1.ReadByte(); 14 } 15 Invoke(new Delegate_RcvDataToTextBox(RcvDataToTextBox), 16 new Object[] { st_rx_buffer.buffer, len }); 17 18 19}

#わかっていること
len = serialPort1.BytesToRead;
ここのlenにセットされる値がまちまちになってしまっている。

#質問
参考となるやり方はありますでしょうか。
今考えているのはタイムアウトを使おうと思っているのですが上手くできず苦しんでおります。
例えば
50msecたっても次のデータが来なければそれまでのデータ群をデータフレームとする
みたいな。

どなたかご教授お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

解決できました。回答して下さったかたありがとうございます!

方法
送信時に
SerialPort.ReceivedBytesThreshold = size
を設定することでデータフレーム受信できました。

※pcはデータ送信したタイミングで返ってくるサイズはわかっている。なのでそのサイズ分受信したときにevent_handlerを動かせばよい

投稿2020/05/05 11:08

hachimitu

総合スコア36

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2020/05/05 12:15

0x1Aを含むデータに対して正常に動きますか?
hachimitu

2020/05/05 13:14

指摘ありがとうございます! 動きませんでした!※eofには反応してしまうんですね↓↓ なので if(len >= size ) { 処理分 } にして途中のeofは処理しないことにしました。
guest

0

それをするためには、通信のブロックの開始データ、バイト数、終端データを決め、その間に実際にデータフレームを入れるというフォーマットを決めましょう。
受信側では開始データの受信でブロックの受信を開始し、当該バイト数まで受信データを貯めていき、終端データの検出で一つのデータブロックの通信を終了します

それと、必要であるならデータブロックの正当性を検出するために、チェックデータも必要になりますね。

データ通信の時間では実装はムリです

投稿2020/05/05 10:19

y_waiwai

総合スコア88055

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問