VisualBasic2005のシリアル通信でバイナリデータを送信したいのですが、、下記のVisualBasic6.0のプログラムではうまくいきますが、
下記のVisualBasic2005のプログラムではうまくいきません。
送信したいバイナリデータは、16進数の82です。
VisualBasic2005では、130と送信されてしまいます。
【VisualBasic6.0】
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
End If
Dim command(0) As Byte
command(0) = &H82
MSComm1.Output = command
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
【VisualBasic2005】
Dim command(0) As Byte
If SerialPort1.IsOpen = False Then
Call SerialPort1.Open()
End If
command(0) = &H82
SerialPort1.Write(command(0))
If SerialPort1.IsOpen = True Then
Call SerialPort1.Close()
End If
よろしくお願いいたします。
よく状況わからないけど
130(10進数)=82(16進数)
です.
そういうことではなくて?
16進数の82という数字をRS232で接続した機器に送りたいのですが、
ASCIIコード?で送信されてしまうみたいです。
文字としてではなく、数値としてシリアルポートから出力したいのですが、
機器側では、文字として認識されてしまいます。
VisualBasic6.0のプログラムの方では、数値として受け取られています。
SerialPort1.Write(command(0))
ではなく
SerialPort1.Write(command)
では。
&H82を送って、送った先が130(&H82)だから、やりたいこと出来てるじゃん。
バイナリだろうがASCIIだろうが&H82(130)は&H82(130)じゃん。
すみません。質問の仕方がまずいかもです。
言い方を変えると、
82という数値を1Byteのデータとして送信したいのです。
上記プログラムでは、82は2Byteで送信されています。
フリーソフトの「RS232Cテストツール」で
普通に82と出力するのと、$付きで82と出力する違いです。
「RS232Cテストツール」の場所
http://www.cablenet.ne.jp/~miyasita/
なにとぞ、よろしくお願いします。
VB6では&h82で1バイトで送信送信されるけど
2005では&h48 &h42(2バイト)ASCIIコードだと文字列で"82"で
送信されるってことでしょうか?
&h82 &h00(2バイト) で送信されるということですか?
#混乱するので「130」は捨ててください(16進数で話しましょう)
#すいません。提示されたリンク先ですが
#環境が用意できないので実行していません
「82」を「数値」として考えているからおかしくなるのでは?
編集 削除もしかして
&h08 &h02(2バイト)ですか ?
もうやりたいことはわからないけど
VB6で書くなら
command(0) = Val(Mid$("&h82", 3))
って感じにしたらいいんじゃない?
「82」が送れますよ
10進数だけど
InputModeプロパティにバイナリモードが設定されてない
なんて事は・・・・。
> 送信したいバイナリデータは、16進数の82です。
> VisualBasic2005では、130と送信されてしまいます。
2バイトだったら130なんてでないだろうと思うが?
いろいろ助言いただきありがとうございます。
自分でも何が悪くて、何をどうしたら、という感じですが、、、
さらに書き換えてみれば、
以下のVB6.0の方のプログラムでシリアル送信したら、
バイナリ16進で「18 E0」と送信できるのに、
以下のVB2005のプログラムでは、
バイナリ16進で「06 98 78 06 78 FE」と長くなってしまいます。
同じようなプログラムに見えるのに何が違うのでしょうか?
VB6.0のように送信するには、どうしたらいいのか、、、
という感じです。
【VisualBasic6.0】
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
End If
Dim command(0) As Byte
command(0) = &H82
MSComm1.Output = command
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
【VisualBasic2005】
Dim command(0) As Byte
If SerialPort1.IsOpen = False Then
Call SerialPort1.Open()
End If
command(0) = &H82
SerialPort1.Write(command(0))
If SerialPort1.IsOpen = True Then
Call SerialPort1.Close()
End If
よろしくお願いします。
月曜の朝にも書きましたが、
× SerialPort1.Write(command(0))
ではなく
◯ SerialPort1.Write(command)
です。
第1引数に「Byte型の配列」ではなく「Byte型」を送っているところが問題です。
ひとつだけ
提示されたプログラム(VB6)
送信側は
> command(0) = &H82(1バイト)なのに
で受信した
「&h18 &hE0」(2バイト)は送信側と受信側で矛盾してませんか?
相手側でなにかしら変換されてないでしょうか?
送信側で出来そうなことといえば、
vb6でいうStrCnv関数でunicodeからasciiコードに
変換してから送ってみては?
#ゴメンナサイ。変換の仕方は分かりません。
>K.J.K.さん
リロードしてなかったのでかぶってしまいました。
>tetsu さん
予想で書いているので、最適回答では無いのは
ご容赦ください。
みなさんいろいろとアドバイスありがとうございました。
以下、変更して解決しました。
×SerialPort1.Write(command(0))
○SerialPort1.Write(command,0,1)
オフセットと書込みバイト数を指定するとOKになりました。
K.J.Kさん、とさんありがとうございました。