C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

vb.netのSerialPortのwriteのメソッド

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■89696 / inTopicNo.1)  vb.netのSerialPortのwriteのメソッド
  
□投稿者/ かずま (3回)-(2018/12/14(Fri) 17:07:59)

分類:[VB.NET/VB2005 以降] 

2018/12/14(Fri) 17:08:29 編集(投稿者)

SerialPortクラスのwriteメソッドにて

下記のコードで送信をしているのですが、&H6が6と受信側に認識される。
(受信側にはのんさんのRS232Cテストツールを使用しています。http://nonsoft.la.coocan.jp/)

dim ACK As Byte = &H6
SerialPort.Write(ACK)

アスキーコードの0x06 ACK(受信OK)を送信したいのですが
どのように送信すればよろしいのでしょうか?

dim ACK As Byte = &H60 だと 36に、
dim ACK As Byte = &H15 だと 21になってしまいます。


引用返信 編集キー/
■89697 / inTopicNo.2)  Re[1]: vb.netのSerialPortのwriteのメソッド
□投稿者/ 魔界の仮面弁士 (1994回)-(2018/12/14(Fri) 17:19:18)
No89696 (かずま さん) に返信
> SerialPortクラスのwriteメソッドにて
> 下記のコードで送信をしているのですが、&H6が6と受信側に認識される。

プロジェクトのプロパティの「コンパイル」タブで、
Option Strict を On に設定して開発されることをお奨めします。

コードに誤りがあるとエラーが表示されますので、
今回のような問題を事前に見つけやすくなります。


> dim ACK As Byte = &H6
> SerialPort.Write(ACK)

Byte 型の引数 1 つを受け取るオーバーロードは存在しません。

Write メソッドの引数定義は

・Write( str As String )
・Write( buffer As Byte(), offset As Integer, count As Integer )
・Write( buffer As Char(), offset As Integer, count As Integer )

の 3 種類です。


今回の場合、Option Strict が Off だったので、暗黙の型変換によって
SerialPort1.Write( CStr(ACK) ) 相当すなわち
SerialPort1.Write( "6" ) の意味で実行されてしまったのでしょう。

バイナリデータで出力したい場合には、「Byte の配列」を用いてみてください。
たとえば、
 Dim ACK As Byte = &H6
 Dim buffer As Byte() = { ACK }
 SerialPort1.Write( buffer, 0, 1)
にしてみるということです。
引用返信 編集キー/
■89698 / inTopicNo.3)  Re[2]: vb.netのSerialPortのwriteのメソッド
□投稿者/ かずま (4回)-(2018/12/14(Fri) 17:32:52)
魔界の仮面弁士さま

たびたび、ありがとうございます。
うまく動作しました。
文字型に変換されていたのですね、非常に勉強になり、とても助かりました。

今後はOption StrictはOnにします、ありがとうございました。
解決済み
引用返信 編集キー/
■89699 / inTopicNo.4)  Re[3]: vb.netのSerialPortのwriteのメソッド
□投稿者/ 魔界の仮面弁士 (1995回)-(2018/12/14(Fri) 17:52:24)
No89698 (かずま さん) に返信
> 文字型に変換されていたのですね、

いいえ。
文字型(Char 型)ではなく
文字列型(String 型)です。



No89696 (かずま さん) に返信
> dim ACK As Byte = &H60 だと 36に、

この場合、先の誤りで 文字列 "96" として解釈された場合、
&H39,&H36 の 2 バイトになると予想されます。
上記の 36 とは恐らく、この 2 バイト目の事でしょう。

あるいは dim ACK As Byte = 60 だったのだとすれば、、
文字列 "60" として送出され、&H36, &H30 の 2 バイトとして
扱われることになります。この場合には 1 バイト目が 36 になりますね。


> dim ACK As Byte = &H15 だと 21になってしまいます。

こっちが思い当たらなかったです。

16 進数 &H15 は、確かに 10 進数 21 と同義なのですが、
&H15 を .Write( str As String ) に渡して、21 になることがあるのだろうか…。

数値ではなく、文字列 "21" が送られたと仮定すれば、
&H32,&H31 の 2 バイトが送出されたことになりそうですが。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ