投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/7/10 21:18:14
> ①F2-F0-03-FF
F2-F0-FF-03 だったのでは無いのですか?

WriteUSART(1023  >> 8);      // 0x03
delay_ms(50);
WriteUSART(1023  & 0x00FF);  // 0xFF


なのか

WriteUSART(1023  & 0x00FF);  // 0xFF
delay_ms(50);
WriteUSART(1023  >> 8);      // 0x03


なのかをはっきりさせてください。
10bit 部分がリトルエンディアンなのかビッグエンディアンなのかで
解析手順が微妙に変わります。



前回の FF-FF ヘッダの時は前者でしたので、その前提で
サンプルコードを提示しましたが、今度は後者なのですね?



> 私の考えでは、先頭バイトがF2-F0でなければ、Returnでスルーしています。
> ここまでは、良いと思っていますが、
良くないです。F2-F0 の後ろの 2 バイトを読み捨ててしまっているので、
次回読みだした時も、また F2-F0 になってします。


> 次にReadしたときも、同じデータの並びになってしまうのでしょうか。
毎回、4 バイトずつ読みだしているのでそうなります。
ズレを検知して、次回以降の読み出し開始を変えなければ行けません。




提示いただいたコードの動きを追ってみましょうか。


ここでは話を単純にするため、1000 ミリ秒の等間隔で
 F2-F0-03-FF-F2-F0-03-FF-F2-F0-03-FF-…
とデータが送信されてくるものと仮定します。


まずは①のケースです。(ズレなし)
> ①F2-F0-03-FF
データの送信開始時刻を 10:00:00 とし、
受信もその直後に行われて、ズレが起きていなかった場合、
下記の手順で処理が実行されます。

---------------
10:00:00
 送信側:"F2" を送信。
 受信側:"F2" を受信。バッファの中身は F2 で、BytesToRead は 1。
 コード:『If SerialPort1.BytesToRead >= 4 Then』で無いので処理終了。

10:00:01
 送信側:"F0" を送信。
 受信側:"F2" を受信。バッファの中身は F2-F0 で、BytesToRead は 2。
 コード:『If SerialPort1.BytesToRead >= 4 Then』で無いので処理終了。

10:00:02
 送信側:"03" を送信。
 受信側:"03" を受信。バッファの中身は F2-F0-03 で、BytesToRead は 3。
 コード:『If SerialPort1.BytesToRead >= 4 Then』で無いので処理終了。

10:00:03
 送信側:"FF" を送信。
 受信側:"FF" を受信。バッファの中身は F2-F0-03-FF で、BytesToRead は 4。
 コード:Read で 4 バイト読まれたので、バッファは空になり BytesToRead も 0 になる
  『If rdat1(0) = &HF2 AndAlso rdat1(1) = &HF0 Then』を通るので、
  「03-FF」が Invoke に渡される。

10:00:04
 送信側:"F2" を送信。
 受信側:"F2" を受信。バッファの中身は F2 で、BytesToRead は 1。
 コード:『If SerialPort1.BytesToRead >= 4 Then』で無いので処理終了。
 ※以下繰り返し
---------------


次は④のケースです。(1 バイトのズレが起きていた場合)
> ④F0-03-FF-F2
---------------
10:00:00
 送信側:"F0" を送信。
 受信側:"F0" を受信。バッファの中身は F0 で、BytesToRead は 1。
 コード:『If SerialPort1.BytesToRead >= 4 Then』で無いので処理終了。

10:00:01
 送信側:"03" を送信。
 受信側:"03" を受信。バッファの中身は F0-03 で、BytesToRead は 2。
 コード:『If SerialPort1.BytesToRead >= 4 Then』で無いので処理終了。

10:00:02
 送信側:"FF" を送信。
 受信側:"FF" を受信。バッファの中身は F0-03-FF で、BytesToRead は 3。
 コード:『If SerialPort1.BytesToRead >= 4 Then』で無いので処理終了。

10:00:03 ★問題のある部分★
 送信側:"F2" を送信。
 受信側:"F2" を受信。バッファの中身は F0-03-FF-F2 で、BytesToRead は 4。
 コード:Read で 4 バイト読まれたので、バッファは空になり BytesToRead が 0 になる。
  『If rdat1(0) = &HF2 AndAlso rdat1(1) = &HF0 Then』を通らないので処理終了。
 → Invoke に到達しない

10:00:04
 送信側:"F2" を送信。
 受信側:"F2" を受信。バッファの中身は F2 で、BytesToRead は 1。
 コード:『If SerialPort1.BytesToRead >= 4 Then』で無いので Return。
 ※以下繰り返し
---------------

まずいのは、いきなり 4 バイト単位で読みだそうとしている上に、
使わんかったデータを捨ててしまっている点です。

次回以降も、その次の 4 バイトが使われるだけなので、
いつまで経ってもズレを解消できません。
読み出すバイト数は必要最低限にしてください。