VB6 MSComm 混合 ASCII 和二进制

VB6 MSComm Mixed ASCII and Binary

正在尝试从设备中检索数据,该设备将以混合的 ASCII 和二进制形式将数据发回给我。我可以读取字符串的 ASCII 部分,但无法将二进制转换为数字(作为 IEEE 浮点数发送)。

我收到:6 个字节的 ASCII,然后是 5 个字节的二进制,第一个二进制字节是 1 到 6 之间的整数,后面的四个字节代表一个 IEEE 浮点数。现在忽略浮点数,我正在努力将我的第 7 个字节转换为整数,已从控件作为 ASCII 字符串返回。如果我能让它工作,那么应该能够将相同的主体应用于最后四个字节以获得我的浮点数。

我曾尝试在读取二进制数据之前更改 COM 控件的 InputMode,但这似乎不起作用 - 这是否允许,我不确定。

有什么建议吗?

试试这个:将数据作为字节数组读入一个变体,然后将这些部分分别复制到不同的字节数组。第一段可以使用 StrConv 转换为字符串,第二段可以通过简单赋值 (MyInt = CInt(byt(x)) 转换为整数,其余部分使用 CopyMemory 复制为浮点数。 (如果整数字节是 ASCII,则改为 MyInt = Asc(byt(x))。)

好的,我猜你可以阅读 ASCII 部分,因为你设置了 InputMode = comInputModeText。取而代之的是,设置 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 个字节长,您可以将其转换为字符串,您的第二个值是 1 个字节长,因此您可以将其转换为一个字节(或整数或长整数,无论​​您想要什么)。你的 tirth 值是 4 个字节长,所以它适合一个。

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