VB6 MSComm смешанный ASCII и двоичный код
Пытается получить данные с устройства, которое отправит их мне обратно в виде смешанных ASCII и двоичных файлов. Я могу прочитать ASCII-часть строки, но не могу преобразовать двоичный код в число (отправленное как IEEE с плавающей запятой).
Я получаю: 6 байтов ASCII, затем 5 байтов двоичного кода, причем первый двоичный байт находится в целочисленном числе между 1 и 6, а следующие четыре представляют собой число с плавающей запятой IEEE. Игнорируя плавающую точку на данный момент, я изо всех сил пытаюсь преобразовать свой 7-й байт в целое число, возвращенное из элемента управления в виде строки ASCII. Если я могу заставить это работать, a должен быть в состоянии применить тот же принцип к последним четырем байтам, чтобы получить мое число с плавающей запятой.
Я пытался изменить InputMode для COM-элемента управления перед чтением двоичных данных, но это, кажется, не работает - это даже разрешено, я не уверен.
Есть предложения?
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