2017-05-26 66 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'。對於同一件事,只是一個不同的名字。 –