【问题标题】:VB6 MSComm Mixed ASCII and BinaryVB6 MSComm 混合 ASCII 和二进制
【发布时间】:2017-10-27 07:02:44
【问题描述】:

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

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

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

有什么建议吗?

【问题讨论】:

  • 只要把一切都当作二进制,ASCII 只是二进制字节值的常见情况。谷歌“vb6 将字节转换为单字节”,点击率很高。
  • 你设置InputMode = comInputModeText了吗?

标签: com binary vb6 type-conversion ascii


【解决方案1】:

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

【讨论】:

  • 你写了float但我相信它一定是single-无论如何,我赞成你的建议
  • @deblocker Right - single in VB = float 在大多数其他情况下。只是同一事物的不同名称。
【解决方案2】:

好的,我猜你可以读取 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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-09
    • 2020-06-11
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多