VB6.0 SP6
WindowsXPにてソフトを作成しています。
もともとN88Basicで動作していたソフトを、Windowsで動作させるために
VB6.0にて作成しています。
Basicでは、&H20-&HA0までのAscii文字をそのまま、LPrintにて出力できたようですが、これを、そのままVB6.0のコードに落として、上記のAscii文字をシリアル通信で送信すると
H,"%メB)・|J...
といった形で出力されました。
Strconvにて変換しても結果は同様でした。
どういった変換をすればいいのか、ご存知の方教えてください。
説明が足りなかったので、補足します。
PCと装置をシリアルで接続した環境にて、上記のソフトを動作させます。
PCから、" !#$%&'()..."と出力すると、
装置からは、" H,"%メB)・|J..."といった形で出力されます。
String 型に載せて送るのではなく、
Byte 配列に載せて送ってみてください。
Byte配列に
MSComm1.Output =&H20
MSComm1.Output =&H21
・・・
と送信しましたが、結果は同じでした。
MSComm1のInputModeは0です。
Byte配列に
MSComm1.Output =&H20
MSComm1.Output =&H21
・・・
と送信しましたが、結果は同じでした。
MSComm1のInputModeは0です。
Dim OutByteData(1 To 4) As Byte
Dim OutStrData As String * 2
OutByteData(1) = &h41
OutByteData(2) = &h42
OutByteData(3) = &h43
OutByteData(4) = &h44
OutStrData = OutByteData()
MSComm1.Output = OutStrData
PDQCommだと出来ると思いますが。MSCommで
出来るかどうかは不明です。
MSComm.Output に「String 型」を渡す事も避けてください。
基本的には、「Byte の一次元配列」を渡すようにします。
http://support.microsoft.com/kb/411403/ja
バイト配列の作り方としては、
Dim bin() As Byte
ReDim bin(3)
bin(0) = &H2A
bin(1) = &H2B
bin(2) = &H2F
bin(3) = &H3A
のようにして作る方法や、XDR にて16進数文字列から
バイナリ変換する方法などがあります。
Private Sub Command1_Click()
Dim bin() As Byte
bin = GetBinary("2a2b2f3a")
'
End Sub
Public Function GetBinary(ByVal hexString As String) As Byte()
With CreateObject("Microsoft.XMLDOM").createElement("h")
.DataType = "bin.hex"
.Text = hexString
GetBinary = .NodeTypedValue
End With
End Function
みなさんアドバイスありがとうございました。
MSComm1.Output =chr(&H20)
と、Chr関数を使うことで正常に動作させることができました。
ありがとうございました。
>> &H20-&HA0までのAscii文字をそのまま、LPrintにて出力できたようですが
> と、Chr関数を使うことで正常に動作させることができました。
今回使いたい範囲は、&H20-&HA0 なのですよね。
であれば、Chr を使う方法は避けてください。
この範囲のデータを送出したい場合には、文字列ではなく
バイナリで扱うべきです。そうしないと、一部の文字が
破損してしまう可能性があります。(特に &H81-&H9F あたり)
http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_43795_0.html
VB6 付属のヘルプ(MSDN ライブラリ)で、キーワード検索
『ASCII 文字セット』を確認してみてください。
そこに、
ASCII 文字セット (0 - 127)
ASCII 文字セット (128 - 255)
という一覧表があるのですが、その中で
「これらの文字は、Microsoft Windows ではサポートされていません。」
と表記されている値を String にしようとすると、
正しく処理されない可能性があります。
Chr によるデータ破損の可能性は、下記のコードで確認できます。
'以下の処理は、9x 系 OS と NT 系 OS とで結果が異なります。
Dim i As Integer
Dim s As String
For i = &H20 To &HA0
s = Chr(i)
If Asc(s) = i Then
Debug.Print Hex(i); " は化けずに処理されました。"
Else
Debug.Print Hex(i); " は破損しました。"
End If
Next