Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
シリアル通信の受信データを表示
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30252#CommentId82889
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
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 。