尝试从设备中检索数据,并将其作为混合ASCII和二进制文件发送给我。我可以读取字符串的ASCII部分,但不能将二进制转换为数字(作为IEEE浮点发送)。
我收到:6个字节的ASCII,然后是5个字节的二进制,第一个二进制字节在1和6之间的整数,后面的四个表示IEEE浮点数。暂时忽略浮点数,我正在努力将我的第7个字节转换为整数,从控件返回为ASCII字符串。如果我能使这个工作,应该能够将相同的主体应用于最后的四个字节以获得我的浮点数。
我已经尝试在读取二进制数据之前更改COM控件的InputMode但这似乎不起作用 - 这是否允许,我不确定。
有什么建议吗?
答案 0 :(得分:2)
尝试这样做:将数据作为字节数组读入变量,然后将这些部分分别复制到不同的字节数组。第一个段可以使用StrConv
转换为字符串,第二个段可以通过简单赋值(MyInt = CInt(byt(x)
)转换为整数,其余部分使用CopyMemory
复制到浮点数。 (如果整数字节是ASCII,则改为MyInt = Asc(byt(x))
。)
答案 1 :(得分: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个字节长,您可以将其转换为String,第二个值是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