投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/7/8 12:17:24
> WriteUSART(0x00FF);
00FF だと、桁数的に 16bit 値であるような印象を受けました。

google で "WriteUSART" を調べてみたところ
>> void WriteUSART(char data);
という解説がなされていました。
char は 8 bit 値なので、WriteUSART(0xFF); 表記の方が
見た目的には良いのではないでしょうか。(動作結果は同じだと思います)



> rdat(n)と、rdata(n+1)がそれぞれ、&HFFであることを確認する方法にチャレンジしています。
n = 0 で良いのなら、たとえば
 If rdat(0) = &HFF AndAlso rdat(1) = &HFF Then
あるいは、
 If (rdat1(0) * 256 + rdat1(1)) = &HFFFF Then
ということでしょうか。



> Dim rdat1(4) As Byte
これは『Dim rdat1(0 To 4) As Byte』の意味になるので、
5バイト分の領域が確保されます。ご注意ください。


> 受信データは、FF FF FF 03 となります。
> 読み取ったデータをDebugLineで確認した所、次の値が表示されます。

DebugLine というのは、Debug.WriteLine のことかと思いますが、
本当にこれだけのコードで 255, 0, 255, 0, 255, 0, , 3, 0 が
出力されたのでしょうか?

最初に数値が 6 個、次に空行、続けて 数値が 2 つということは、
空行も含めて 計 9 行の出力になっているようですが…。

提示いただいたコードでは、「FF FF FF 03」を受信した後には
> Debug.WriteLine(rdat1a)
> Debug.WriteLine(rdat2a)
の 2 回しか出力されていませんので、各回の出力結果は 2 行だけのはず。



テスト手順を確認させてください。

「FF FF FF 03」が受信された後、ReadBufferSize >= 4 の判定を通過して
Dim rdat1(4) As Byte で確保された配列(5 バイト分の領域)が、
> SerialPort1.Read(rdat1, 0, 4)
により、rdat1 の先頭 4 バイト部分が書き換えられ、
 rdat1 = New Byte() {&HFF, &HFF, &HFF, &H3, &H0}
に相当する内容になるのかな、と想像していましたが、今は違うのですね?

確認のため、SerialPort1.Read(rdat1, 0, 4) の直後に
Debug.WriteLine(BitConverter.ToString(rdat1))
を実行してみてください。

それが本当に "FF-FF-FF-03-00" なのだとしたら、提示いただいたコードの出力結果は
255, 0, 255, 0, 255, 0, , 3, 0 ではなく、-1, 1023 になるはずなのです。



> Dim rdat1bin As Byte() = {rdat1(0), rdat1(1)}
> Dim rdat2bin As Byte() = {rdat1(2), rdat1(3)}
> Dim rdat1a As Short = CShort(BitConverter.ToInt16(rdat1bin, 0))   '符号付き 2 バイト整数に変換 
> Dim rdat2a As Short = CShort(BitConverter.ToInt16(rdat2bin, 0))   '符号付き 2 バイト整数に変換 

昨日のコードでは
> Dim rdatbin As Byte() = {rdat(3), rdat(2), rdat(1), rdat(0)}
と降順に並べていたのに、今度は昇順ですね。どちらが正しい順序でしょうか。

並び順を入れ替える必要が無いのなら、わざわざ 2 バイト単位で詰め直さずとも
 Dim rdat1a As Short = BitConverter.ToInt16(rdat1, 0)  'rdat(0)
 Dim rdat2a As Short = BitConverter.ToInt16(rdat1, 2)
で十分ですよ。負数になると都合が悪いのなら、
 Dim rdat1a As UShort = BitConverter.ToUInt16(rdat1, 0)
 Dim rdat2a As UShort = BitConverter.ToUInt16(rdat1, 2)
でも OK 。