Как прочитать входные данные из последовательного порта (например, COM 3) в файл Excel в шестнадцатеричном формате? - PullRequest
3 голосов
/ 04 июля 2019

Я загружаю набор байтов с внешнего устройства на COM-порт.Результирующий ввод необходимо поместить в ячейку в Excel и преобразовать в шестнадцатеричный формат.Я пробовал различные наборы инструментов, но ни один из них не показывает никаких результатов в Excel.

Я пробовал некоторые расширения VBA, но за них все заплатили, пробовал также некоторые терминальные инструменты.Текущий код инструмента VBA показан ниже.Я не могу заставить его показывать что-либо в ячейке Excel.Результаты просто отображаются в непосредственном логгере.

Private Sub StrokeReader1_CommEvent(ByVal Evt As StrokeReaderLib.Event, ByVal data As Variant)
  Select Case Evt
    Case EVT_DISCONNECT
        Debug.Print "Disconnected"

    Case EVT_CONNECT
        Debug.Print "Connected"

    Case EVT_DATA
        buf = (StrokeReader1.Read(Text))  'Use BINARY to receive a byte array
        Debug.Print buf
  End Select
End Sub

'Use this to connect and set the port properties from the code
Sub connect()
  StrokeReader1.Port = 3
  StrokeReader1.BaudRate = 19200
  StrokeReader1.PARITY = NOPARITY
  StrokeReader1.STOPBITS = ONESTOPBIT
  StrokeReader1.DsrFlow = False
  StrokeReader1.CtsFlow = False
  StrokeReader1.DTR = False
  StrokeReader1.RTS = False
  StrokeReader1.Connected = True
  If StrokeReader1.Error Then
    Debug.Print StrokeReader1.ErrorDescription
  End If
End Sub

'Use this to send data to the remote device
Sub send()
  StrokeReader1.send "ABCD"  'A text string

  Dim x(3) As Byte  'A byte array
  x(1) = 1
  x(2) = 2
  x(3) = 3
  StrokeReader1.send x
End Sub

Ожидаемые результаты: AA 00 00 22 00 03 00 00 03 2B 01 E1 35

Фактический результат: ª " Ö $$

1 Ответ

1 голос
/ 04 июля 2019
Case EVT_DATA
    buf = (StrokeReader1.Read(Text))  'Use BINARY to receive a byte array
    Debug.Print buf

Вы получаете байтовый массив, который с точки зрения VBA неотличим от строки - это единственная причина, по которой Debug.Print buf не выдает ошибку несоответствия типов - потому что любая другая У массива просто нет возможности представить себя в виде строки, поэтому вы не можете отладить-распечатать массив.

Вам нужно итерировать байты в массиве, использовать функцию Hex, чтобы получить шестнадцатеричное представление каждого байта, и объединить их в четкую строку.

Примерно так:

Private Function ToHexString(ByRef buffer As Variant) As String
'note: buffer array is wrapped in a Variant, could be passed ByVal

    'first allocate/size a dynamic array to hold our results;
    'by sizing from LBound(buffer) to UBound(buffer), we get
    'an array that's sized exactly the same as the buffer array.
    ReDim bytes(LBound(buffer) To UBound(buffer))

    'now iterate all items in the array
    Dim i As Long
    For i = LBound(buffer) To UBound(buffer)
        'store the hex representation of the byte at index i into our hex-bytes array
        bytes(i) = Hex(buffer(i))
    Next

    'return the joined hex-bytes array, using a space to separate the individual hex-bytes
    ToHexString = Strings.Join(bytes, " ")

End Function

Теперь вы можете сделать Debug.Print ToHexString(buf), и это должно дать ожидаемый результат.

Если вы хотите получить этот вывод в ячейку, вам нужно получить объект Range от определенного Worksheet. Например, если вы хотите записать в ячейку A1 любой активный лист:

ActiveSheet.Range("A1").Value = ToHexString(buf)

или

ActiveSheet.Cells(1, 1).Value = ToHexString(buf)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...