DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VB.NET:シリアル通信:Byte型配列の送信

環境/言語:[VB.NET2005]
分類:[.NET]

VB.NETのシリアルポートコントロールを使用しています。
Byte型配列をString型に変換して以下のように
Dim a(8) As Byte
a(0) = Asc("Y")
a(1) = CByte(Val("&h" & "FF"))
a(2) = 0

Dim sSendData As String = System.Text.Encoding.GetEncoding("Shift_JIS").GetString(a)
SerialPort1.WriteLine(sSendData)

送信すると、受信側では a(1) = &H3F
になります。a(1) = &HFFのまま受信させるには
どうすれば良いでしょうか?
(WinAPIは使いたくありません。)
> a(1) = CByte(Val("&h" & "FF"))

a(1) = 255
>>a(1) = CByte(Val("&h" & "FF"))
>
> a(1) = 255
>

CByte(Val("&h" & "FF"))でも、問題なく255になると思います。

問題は、はじめから文字列でないバイト型配列を、無理やり文字列に変換しようとしている点でしょう。バイト型配列はそのまま送れるのであればそうすべきですが、どうしても文字列に変換しなければならないのであれば、Base64などを使うべきではないでしょうか。
ご意見ありがとうございます。

a(1) = CByte(Val("&h" & "FF"))

a(1) = 255

でも結果はNGです。

やはりStringに変換した時点で、255=&hFFは文字にならないため、
&h3F=「置き換え文字に設定している?」に変換されてしまうようです。
(Base64も試しました)
(相手のプログラム(改変できない)が&h3Fではエラーにしてしまう)

WinAPIを選択肢に加えるしかないですか?
■No14920に返信(あおちゃんさんの記事)
SerialPort1のParityプロパティがParity.nonになっていますか?
パリティビットを使っていると文字コードは0〜&h3fの間でのコードしか使えませんが
追加情報です。
以下のコードを実行してみましたが、&hFFは&hFFのままで&h3Cにはエンコーディングされていないようです。やはりシリアルポートの設定ではないかと思います。

Dim SerialPort1 As New System.IO.Ports.SerialPort
Dim a(8) As Byte
a(0) = Asc("Y")
a(1) = CByte(&HFF)
a(2) = Asc("@")
a(3) = Asc("・")

Dim sSendData As String = System.Text.Encoding.GetEncoding("Shift_JIS").GetString(a)
Dim i As Integer, str As String
str = ""
For i = 1 To 4
str = str + Format("00", Asc(Mid(sSendData, i, 1))) & " "
Next
MsgBox(str)
■No14926に返信(Aotomboさんの記事)
> ■No14920に返信(あおちゃんさんの記事)
> SerialPort1のParityプロパティがParity.nonになっていますか?
> パリティビットを使っていると文字コードは0〜&h3fの間でのコードしか使えませんが


Parity.nonになっていました。しかし、ほか試しても同じでした。
■No14926に返信(Aotomboさんの記事)
>■No14920に返信(あおちゃんさんの記事)
>SerialPort1のParityプロパティがParity.nonになっていますか?
>パリティビットを使っていると文字コードは0〜&h3fの間でのコードしか使えませんが

■14928 / inTopicNo.6) のAotomboさんのプログラムを実行すれば、
確かにそうなります。問題はローカルではなくて、相手のハイパーターミナルで
どうかです。
> やはりStringに変換した時点で、255=&hFFは文字にならないため、
> &h3F=「置き換え文字に設定している?」に変換されてしまうようです。

すでに指摘されていることですが、どうしてバイト配列のまま送信しないんでしょう?
■No14944に返信(渋木宏明(ひどり)さんの記事)
>>やはりStringに変換した時点で、255=&hFFは文字にならないため、
>>&h3F=「置き換え文字に設定している?」に変換されてしまうようです。
>
> すでに指摘されていることですが、どうしてバイト配列のまま送信しないんでしょう?
>

そこをお伺いしますが、「バイト配列のまま送信する」にはどうすればいいでしょうか?

条件は何回も申し上げているように
SerialPort1.WriteLine(sSendData)

で送りたいのです。
> 条件は何回も申し上げているように
> SerialPort1.WriteLine(sSendData)
>
> で送りたいのです。

だからどうして?

SerialPort1.Write(byteArray, 0, byteArray.Length)

で、改行文字を含んだバイト配列を送れば同じことですよね?
■No14961に返信(渋木宏明(ひどり)さんの記事)
>>条件は何回も申し上げているように
>>SerialPort1.WriteLine(sSendData)
>>
>>で送りたいのです。
>
> だからどうして?
>
> SerialPort1.Write(byteArray, 0, byteArray.Length)
>
> で、改行文字を含んだバイト配列を送れば同じことですよね?
>

渋木宏明(ひどり)さんありがとうございます。解決しました!

Dim a(8) As Byte
a(0) = Asc("Y")
a(1) = CByte(&hFF) または 255
a(2) = 0

Dim sSendData As String = System.Text.Encoding.GetEncoding("Shift_JIS").GetString(a)
SerialPort1.Write(a, 0, a.Length)
ですね。

SerialPort1.WriteLineしか見えていませんでした。
SerialPort1.Writeを使えばよかったのですね。

これで無事シリアル通信が可能になりました。
本当に助かりました。先へ進めます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板