2017-05-26 58 views
2

デバイスからデータを取得しようとすると、ASCIIとバイナリが混在して送信されます。私は文字列のASCII部分を読むことができますが、バイナリを(IEEE浮動小数点として送信された)数値に変換することはできません。VB6 MSComm ASCIIとバイナリが混在しています

ASCIIの6バイト、次にバイナリの5バイト、最初のバイナリバイトは1から6の間の整数で、次の4つはIEEE浮動小数点数を表します。今のところ浮動小数点を無視して、私は第7バイトを整数に変換し、ASCII文字列としてコントロールから返されてしまっています。私はこの作業を得ることができる場合は、私の浮動小数点数を得るために最後の4バイトに同じプリンシパルを適用できる必要があります。

バイナリデータを読み込む前にCOMコントロールのInputModeを変更しようとしましたが、これはうまくいかないようです。これは許可されていてもわかりません。

提案がありますか?

+1

バイナリとして扱うだけで、ASCIIはバイナリバイト値の一般的なケースです。 Googleの "vb6をシングルバイトに変換する"、たくさんのヒットがあります。 –

+0

'InputMode = comInputModeText'を設定しましたか? – deblocker

答えて

2

を入力してください。InputMode = comInputModeTextを設定しているので、ASCII部分を読み取ることができます。その代わりにInputMode = comInputModeBinaryと設定します。

は、すでに述べたように、この関数を宣言し、別の答えで述べた:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long) 

レッツは、あなたのinputような受信バッファを言う:

Dim buf(0 To 10) As Byte 

' receiving... 

buf(0) = &H62 
buf(1) = &H69 
buf(2) = &H6E 
buf(3) = &H61 
buf(4) = &H72 
buf(5) = &H79 
buf(6) = &H8 
buf(7) = &HD0 
buf(8) = &HF 
buf(9) = &H49 
buf(10) = &H40 

あなたの最初の値が6バイトの長さとすることができますそれをStringに変換すると、2番目の値は1バイトになります。したがって、バイトに変換できます(整数またはLongに変換できます)。あなたの誕生値は4バイトの長さなので、1つに収まるでしょう。

Dim t as String, b As Byte, s As Single 

t = StrConv(LeftB(buf, 6), vbUnicode) 
Call CopyMemory(VarPtr(b), VarPtr(buf(6)), 1) 
Call CopyMemory(VarPtr(s), VarPtr(buf(7)), 4) 
Debug.Print t, b, s ' will print binary 8 3,14159 
2

これを試してください:データをバイト配列としてバリアントに読み込み、別々のバイト配列に別々にセクションをコピーします。最初のセグメントはStrConvを使用して文字列に変換され、2番目のセグメントは単純割り当て(MyInt = CInt(byt(x))によって整数に変換され、残りはCopyMemoryを使用してfloatにコピーされます。 (整数バイトがASCIIの場合は、MyInt = Asc(byt(x))の代わりに

+0

あなたは 'float'を書きましたが、私はそれが' single'でなければならないと信じています - とにかく、私はあなたの提案をアップアップします – deblocker

+0

@deblocker右 - ほとんどの他のコンテキストではVB = 'float'の' single'。同じことのためのちょうど別の名前。 –

関連する問題