投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/7/5 15:22:43
> 試してみたことを整理します。

本来は③を使いたかったけれども、うまくいかなかったので
今回の要件には合わないと理解したうえで、とりあえず
①や②を試行してみた状況とお見受けします。


> 型'System.Byte[]'のオブジェクトを型'System.String'に変換できません

このエラーは、どの行で発生していますか?

それと、DataReceived イベントを使う場合は、e.EventType の値にも気を配った方が良さそうです。
http://d.hatena.ne.jp/defint/20090729/1248877026


> ③続いて、複数バイト読み取るため、受信データをbyte配列で宣言して試しました。
> 'Dim data As Byte() = New Byte(SerialPort1.BytesToRead - 1) {}
> 'SerialPort1.Read(data, 0, data.GetLength(0))
> 'System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(data)
3 行目は、
 Dim strData As String = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(data)
ではありませんか? 折角変換しても、その結果を受け取らないと意味がありません。

ちなみに 1 行目は、
「Dim data As Byte() = New Byte(SerialPort1.BytesToRead - 1) {}」は
「Dim data(SerialPort1.BytesToRead - 1) As Byte」
とも書けます。


ついでに言えば、シフトJIS を指定する場合には、
 .GetEncoding("shift_jis")
 .GetEncoding(932)
のいずれかを個人的にはお奨めしています。

"SHIFT-JIS" 指定も間違いでは無いのですが、これは別名表記だからです。
(他の別名として: "csWindows31J"、"csShiftJIS"、"x-sjis"、"x-ms-cp932"、"ms_Kanji")



> 試しているコードは次の通りです。(①を試したときのコード)
これについては、データ型の指定に問題がありますので、
『Option Strict On』を有効にしておくことをお奨めします。


また、Delegate_RcvDataToTextBox の定義も漏れているようです。
とはいえ、わざわざ自前でデリゲートを用意せずとも、
 Invoke(New Action(Of String)(AddressOf RcvDataToTextBox), data)
として利用可能な、Action(Of ) デリゲートを使うことが可能です。


> ①SerialPort1.ReadByte()で読み取ると、"255"が表示される
> Dim data As String
> data = SerialPort1.ReadByte()
Dim data As String ではなく
Dim data As Integer で受け取るべきです。

それはさておき、data が 255 になってしまうという状況についてですが、
このメソッドから、1023 という 10bit の値が直接返されることはありません。


ReadByte のデータ型は、32 bit 長である「Int32 型」で定義されていますが、
実際に返却される値は、8 bit 長である「Byte 型」のデータであるためです。

ちなみに、なぜ ReadByte が As Byte ではなく As Integer になっているかというと、
ストリームの末尾が読み取られた場合に限り、&H00~&HFF の範囲ではなく、
-1 を返すように設計されているためです。


ReadByte を 2 回呼べば、&H3FF という 10bit 値を
2 つの 8bitデータ( &HFF と &H3 )で受け取れるのでは無いでしょうか。
もしくは、③ 案の Read メソッドを使うかですね。



> ②SerialPort1.ReadExisting()で読み取ると、
今回受け取りたいデータは「文字」ではないので、
どちらにせよ、このメソッドの出番は無いと思います。

仮に文字を読み取る必要があったとしても、ReadExisting は、
マルチバイト系のエンコーディング(Shift_JIS 等)の先導バイト判定を
必ずしも考慮しないため、データの区切り位置によっては
正しい文字として判定されない可能性があります。ご注意ください。

【区切り位置で化ける文字の例】
0x8181 "="
0x8182 "≠"
0x8281 "a"
0x8282 "b"



> "?"が表示される(ASCIIコード表で0x3FFに該当する文字)?
"?" の ASCII コードは 0x3FF ではなく 0x3F ですね。

そもそも ASCII コード表 に 0x3FF は定義されていません。
本来の ASCII とは、7bitコードのことであり、0x00~0x7F のみが定義されています。
(エンコーディングとしては System.Text.Encoding.ASCII が該当します)


本当に 0x3FF なのだとしたら、『ASCIIコード表』というのが
何かの間違いなのだと思います。

たとえば、シフトJIS のキャラクタコード表が、
拡大解釈されて ASCII コード表と紹介されていることがありますが、
その場合でも 0x03FF や 0xFF03 はありえないでしょう。

0x03 は ␃ を意味する制御文字ですし、
0xFF に至っては未定義領域ですから。


ちなみに Unicode だと、
03,FF (U+FF03) には "#" (FULLWIDTH NUMBER SIGN)
FF,03 (U+03FF) には "Ͽ" (GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL)
が割り当てられています。

Dim FullWidthNumberSign As String = "#"
TextBox1.Text = AscW(FullWidthNumberSign).ToString("X4")
TextBox2.Text = System.BitConverter.ToString(System.Text.Encoding.Unicode.GetBytes(FullWidthNumberSign))