VB2005のシリアル通信でバイナリデータを送る方法

解決


tetsu  2008-03-17 08:21:13  No: 139282

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

よろしくお願いいたします。


ガッ  2008-03-17 11:04:09  No: 139283

よく状況わからないけど
130(10進数)=82(16進数)
です.

そういうことではなくて?


tetsu  2008-03-17 18:14:52  No: 139284

16進数の82という数字をRS232で接続した機器に送りたいのですが、
ASCIIコード?で送信されてしまうみたいです。
文字としてではなく、数値としてシリアルポートから出力したいのですが、
機器側では、文字として認識されてしまいます。

VisualBasic6.0のプログラムの方では、数値として受け取られています。


K.J.K.  2008-03-17 18:26:45  No: 139285

SerialPort1.Write(command(0))
ではなく
SerialPort1.Write(command)
では。


出来てるじゃん?  2008-03-18 04:34:57  No: 139286

&H82を送って、送った先が130(&H82)だから、やりたいこと出来てるじゃん。
バイナリだろうがASCIIだろうが&H82(130)は&H82(130)じゃん。


tetsu  2008-03-18 07:31:03  No: 139287

すみません。質問の仕方がまずいかもです。
言い方を変えると、
82という数値を1Byteのデータとして送信したいのです。
上記プログラムでは、82は2Byteで送信されています。

フリーソフトの「RS232Cテストツール」で
普通に82と出力するのと、$付きで82と出力する違いです。
「RS232Cテストツール」の場所
http://www.cablenet.ne.jp/~miyasita/

なにとぞ、よろしくお願いします。


  2008-03-18 09:48:36  No: 139288

VB6では&h82で1バイトで送信送信されるけど
2005では&h48 &h42(2バイト)ASCIIコードだと文字列で"82"で
送信されるってことでしょうか?

&h82 &h00(2バイト) で送信されるということですか?

#混乱するので「130」は捨ててください(16進数で話しましょう)

#すいません。提示されたリンク先ですが
#環境が用意できないので実行していません


通ってみた  2008-03-18 09:48:53  No: 139289

「82」を「数値」として考えているからおかしくなるのでは?


  2008-03-18 09:51:49  No: 139290

もしかして
&h08 &h02(2バイト)ですか ?


通ってみた  2008-03-18 15:50:32  No: 139291

もうやりたいことはわからないけど
VB6で書くなら
command(0) = Val(Mid$("&h82", 3))

って感じにしたらいいんじゃない?
「82」が送れますよ

10進数だけど


ひでらん  2008-03-18 17:08:16  No: 139292

InputModeプロパティにバイナリモードが設定されてない
なんて事は・・・・。


本当に?  2008-03-19 06:39:00  No: 139293

> 送信したいバイナリデータは、16進数の82です。
> VisualBasic2005では、130と送信されてしまいます。

2バイトだったら130なんてでないだろうと思うが?


tetsu  2008-03-19 07:42:01  No: 139294

いろいろ助言いただきありがとうございます。
自分でも何が悪くて、何をどうしたら、という感じですが、、、

さらに書き換えてみれば、
以下の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

よろしくお願いします。


K.J.K.  2008-03-19 09:01:57  No: 139295

月曜の朝にも書きましたが、

× SerialPort1.Write(command(0))
ではなく
◯ SerialPort1.Write(command)
です。

第1引数に「Byte型の配列」ではなく「Byte型」を送っているところが問題です。


  2008-03-19 09:38:29  No: 139296

ひとつだけ

提示されたプログラム(VB6)
送信側は
> command(0) = &H82(1バイト)なのに
で受信した
「&h18 &hE0」(2バイト)は送信側と受信側で矛盾してませんか?

相手側でなにかしら変換されてないでしょうか?

送信側で出来そうなことといえば、
vb6でいうStrCnv関数でunicodeからasciiコードに
変換してから送ってみては?

#ゴメンナサイ。変換の仕方は分かりません。


  2008-03-19 09:45:29  No: 139297

>K.J.K.さん
リロードしてなかったのでかぶってしまいました。

>tetsu さん
予想で書いているので、最適回答では無いのは
ご容赦ください。


tetsu  2008-03-20 03:54:04  No: 139298

みなさんいろいろとアドバイスありがとうございました。
以下、変更して解決しました。

×SerialPort1.Write(command(0))
○SerialPort1.Write(command,0,1)
オフセットと書込みバイト数を指定するとOKになりました。

K.J.Kさん、とさんありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加