2017-05-26 67 views
2

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

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

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

有什么建议吗?

+1

只要将所有内容都视为二进制,ASCII对二进制字节值来说只是一个常见的情况。谷歌“VB6转换字节为单一”,很多很多点击。 –

+0

你已经设置了'InputMode = comInputModeText'? – deblocker

回答

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个字节长,所以你可以将它转换为一个字节(或者整数或长整数,无论​​你想要什么)。你的产值是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 
2

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

+0

你写了'float'但我相信它肯定是一个'单一' - 无论如何,我向你提出建议 – deblocker

+0

@deblocker右边 - 在大多数其他上下文中VB = float的'single'。对于同一件事,只是一个不同的名字。 –