VB6 MSComm смешанный ASCII и двоичный код



Пытается получить данные с устройства, которое отправит их мне обратно в виде смешанных ASCII и двоичных файлов. Я могу прочитать ASCII-часть строки, но не могу преобразовать двоичный код в число (отправленное как IEEE с плавающей запятой).



Я получаю: 6 байтов ASCII, затем 5 байтов двоичного кода, причем первый двоичный байт находится в целочисленном числе между 1 и 6, а следующие четыре представляют собой число с плавающей запятой IEEE. Игнорируя плавающую точку на данный момент, я изо всех сил пытаюсь преобразовать свой 7-й байт в целое число, возвращенное из элемента управления в виде строки ASCII. Если я могу заставить это работать, a должен быть в состоянии применить тот же принцип к последним четырем байтам, чтобы получить мое число с плавающей запятой.



Я пытался изменить InputMode для COM-элемента управления перед чтением двоичных данных, но это, кажется, не работает - это даже разрешено, я не уверен.



Есть предложения?

685   2  

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 

Попробуйте следующее: считайте данные в вариант в виде массива байтов, а затем копируйте разделы отдельно в разные массивы байтов. Первый сегмент может быть преобразован в строку с помощью StrConv, а второй-в целое число с помощью простого присваивания (MyInt = CInt(byt(x)), а остаток скопирован в поплавок с помощью CopyMemory. (Если целочисленный байт-ASCII, то вместо него MyInt = Asc(byt(x)).)

Comments

    Ничего не найдено.