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

解決


tetsu  2008-03-16 23:21:13  No: 139282  IP: 192.*.*.*

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 02:04:09  No: 139283  IP: 192.*.*.*

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

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

編集 削除
tetsu  2008-03-17 09:14:52  No: 139284  IP: 192.*.*.*

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

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

編集 削除
K.J.K.  2008-03-17 09:26:45  No: 139285  IP: 192.*.*.*

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

編集 削除
出来てるじゃん?  2008-03-17 19:34:57  No: 139286  IP: 192.*.*.*

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

編集 削除
tetsu  2008-03-17 22:31:03  No: 139287  IP: 192.*.*.*

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

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

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

編集 削除
 2008-03-18 00:48:36  No: 139288  IP: 192.*.*.*

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

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

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


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

編集 削除
通ってみた  2008-03-18 00:48:53  No: 139289  IP: 192.*.*.*

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

編集 削除
 2008-03-18 00:51:49  No: 139290  IP: 192.*.*.*

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

編集 削除
通ってみた  2008-03-18 06:50:32  No: 139291  IP: 192.*.*.*

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

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

10進数だけど

編集 削除
ひでらん  2008-03-18 08:08:16  No: 139292  IP: 192.*.*.*

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

編集 削除
本当に?  2008-03-18 21:39:00  No: 139293  IP: 192.*.*.*

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

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

編集 削除
tetsu  2008-03-18 22:42:01  No: 139294  IP: 192.*.*.*

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

さらに書き換えてみれば、
以下の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 00:01:57  No: 139295  IP: 192.*.*.*

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

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

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

編集 削除
 2008-03-19 00:38:29  No: 139296  IP: 192.*.*.*

ひとつだけ

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

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


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

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

編集 削除
 2008-03-19 00:45:29  No: 139297  IP: 192.*.*.*

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

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

編集 削除
tetsu  2008-03-19 18:54:04  No: 139298  IP: 192.*.*.*

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

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

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

編集 削除