投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/7/9 15:32:23
 vb素人さん、最初は(学生)でしたが 2回目以降は(社会人)なんですね。


> SerialPort1.BytesToRead >= 4
> にすることで、配列内に受信データが格納されるようになりました。

BytesToRead は、通信状況に応じて変動しますが、
ReadBufferSize は特に指定しない限り 4096 固定なのです。

当初からずっと、Read 前に BytesToRead を使うように書いておきながら、
間違えて ReadBufferSize な処理を書いてしまった私のミスですね。済みません。



> 送信データ(FF FF FF 03が繰り返される)のどこから受信をし始めるかによって
> データが変わってしまいます。

データの区切りが FF,FF なら、「FF 以外のデータを受信するまで待って、その次に FF が来た位置」
を起点として探すという手はあります。今回のデータは 10bit なので。
あるいは、FF FF を区切りとするのではなく、F2 F0 にしてみるとか。


> Aパターン
> ①FF-03-FF-FF
> Bパターン
> ①FF-FF-FF-03

現行コードは 4 バイト単位で取り込んでいるので、
読み取り開始位置も 4 パターンがありえそうです。

Ⓐパターン:FF-03-FF-FF
Ⓑパターン:FF-FF-FF-03
Ⓒパターン:03-FF-FF-FF
Ⓓパターン:FF-FF-03-FF

本来のデータ構造は Ⓑ なのですが、区切りが FF,FF の場合、
Ⓑ と Ⓓ の違いを区別できません。


しかし区切りを F2,F0 にすれば、上記が以下の形になるため、
ⓑのみが正しいパターンであることが明確になります。

ⓐパターン:FF-03-F2-F0
ⓑパターン:F2-F0-FF-03
ⓒパターン:03-F2-F0-FF
ⓓパターン:F0-FF-03-F2


> If SerialPort1.BytesToRead >= 4 Then
DataReceived イベントの処理中にも、刻一刻とデータは送られてきます。


> Dim rdat1(3) As Byte
> SerialPort1.Read(rdat1, 0, 4)
ここで FF FF FF 03 が正しく受け取られた(Ⓑパターン)なら、
 'Dim rdat1() As Byte = {255, 255, 255, 3}
 If rdat1(0) = &HFF AndAlso rdat1(1) = &HFF Then
  Dim rdat1a As UShort = BitConverter.ToUInt16(rdat1, 2)
  Debug.WriteLine(rdat1a)   '1023
 End If
ということになるのでは?

もちろん都合よくⒷになるわけではないので、位置合わせの対処は必要ですが。


> ⇒こちらは何が間違えているのかがよく理解できていません。
いろいろ間違ってます。

> Dim data(size - 1) As Byte
> SerialPort1.Read(rdat1, 2, 2)
> Invoke(New Delegate_RcvDataToTextBox(AddressOf Me.RcvDataToTextBox), data)
変数 data を初期化していますが、Read に渡しているのは data ではなく rdat1 です。
これがまず間違っているでしょうね。


次に、そもそも 2 回目の Read がおかしいです。

仮に Ⓑ パターンだった場合、1023 を意味するデータ &H03FF は
既に rdat1(2) = &HFF および rdat1(3) = &H3 に入っているわけですから、
追加で Read するべきでは無いでしょう。

それに受信データが 4 ~ 7 バイト分だった場合は、
> If size < 4 Then
>   Return
> End If
の箇所で処理が終わってしまいますので、TextBox には到達しません。


仮に、8 バイト以上受信していたとして、かつ運よく、Ⓑパターンだったとしても
① ② ③ ④ ⑤ ⑥ ⑦ ⑧
FF,FF,FF,03,FF,FF,FF,03

のうち、最初の「SerialPort1.Read(rdat1, 0, 4)」では
①②③④の部分が読み込まれ、Invoke 直前の「SerialPort1.Read(rdat1, 2, 2)」で
⑤⑥が読み取られますので、やはりうまくいきません。


最初にヘッダーの 2 バイトだけを読みとり、
それが FF FF の時のみ、次の 2 バイトを読んでいくといった
形にしないと駄目でしょう。

(FF,FF のままだと、先述の区切りの問題も解決しないといけないですが…)