Прочитать ответ COM-порта с VBA 2 - PullRequest
0 голосов
/ 05 апреля 2020

Доброе утро, я хотел бы получить ответ от порта COMx, к которому подключена плата RS485 с 8 реле, чтобы узнать состояние отдельных реле. Я могу отправить команды ВКЛ / ВЫКЛ с помощью следующей команды FF 01 01/00, которая эквивалентна коду.

Open "COM4: 9600, N, 8.1" For Binary As # 1

Put # 1,, Chr (& HFF) & Chr (& H1) & Chr (& H1)/(&H0)

Close # 1

Чтобы узнать ее состояние, команда FF A1 00 имеет ответ FF A1 00 00 00 00 00 00 00 00, но я могу не могу написать это в VBA.

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Прежде всего, ваш код выглядит неправильно.

Скорее всего, это работает, поскольку отправка FF 01 01, возможно, в порядке.

Тем не менее, вам нужен этот "/" в текстовом потоке.

Итак, эта строка кода должна быть:

Put #1, , Chr(&HFF) & Chr(&HA1) & Chr(&H1) & "/" & chr(&H0)

Или, поскольку "/" равно 47 в ASCII, то это также будет хорошо:

Put #1, , Chr(&HFF) & Chr(&HA1) & Chr(&H1) & chr(47) & chr(&H0)

И, 47 ("/") в HEX это 2F

Итак, это будет работать:

Put #1, , Chr(&HFF) & Chr(&HA1) & Chr(&H1) & chr(&H2F) & chr(&H0)

Итак, что вам нужно для 2-й команды?

Вы хотите вывести этот FF A1 00

Put #1, , Chr(&HFF) & Chr(&HA1) & Chr(&H0)

Теперь, вероятно, со временем у вас есть все виды команд. И написание вышесказанного довольно сложно,

Итак, вы бы хорошо сказали создать подпрограмму, которую вы можете вызывать.

Итак, это будет выглядеть так:

Sub WriteCommand(strCommand As String)

  Dim strBuf  As String
  Dim i       As Integer
  strBuf = ""
  For i = 1 To Len(strCommand) Step 3
     strBuf = strBuf & Chr("&H" & Mid(strCommand, i, 2))
  Next i

  Open "COM4: 9600, N, 8.1" For Binary As #1
     Put #1, , strBuf
  Close #1

End Sub

То, что сказано выше, требует от вас, чтобы вы передали строку, и она будет скрывать ее для вас.

Так, например, ваша первая команда такая:

FF 01 01 / 00

Теперь, выше "/" является частью проблемы. «/» на самом деле 47 из таблицы ASCII.

Итак, вышеприведенное будет записано как

FF 01 01 2F 00

Итак, наша процедура для отправки выше будет:

Sub Ctestwr ()

  Dim strCommand    As String      
  ' Note that hex 47 = / = 2F in hex
  strCommand = "FF 01 01 2F 00"
  Call WriteCommand(strCommand)

End Sub

Итак, чтобы отправить свою вторую команду, вы бы / могли сейчас go:

Call WriteCommand("FF A1 00")

Сейчас, Я подозреваю, что во многих случаях после отправки команды вы, вероятно, захотите подождать или получить ответ обратно. Не ясно, отправляет ли устройство результат, а затем ключ возврата, или что результат ВСЕГДА одинаковой длины. Вы бы хорошо узнали эту информацию, так как тогда подпрограмма NEXT, которую вы напишете, объединит приведенный выше код и некоторый код для возврата / захвата / получения ответа, и, вероятно, превратит его обратно в красивую строку HEX с пробелами между каждое значение.

Итак, с помощью описанной выше простой процедуры:

Вы можете легко отправить любую команду. Просто помните, что вы не можете использовать «/» в строке - вы должны заменить его на 47 (& H2F) (но просто запишите это число).

Итак, теперь для отправки любой команды , вы можете просто сделать это:

Sub Ctestwr()

  ' Note that hex 47 = / = 2F in hex

  Call WriteCommand("FF 01 01 2F 00")

End Sub

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

Итак, вы можете go:

 dim strResult   as string

 strResult = CmdAndResponse("FF 01 01 2F 00")
 ' strResult would now have the response sent from the machine

Итак, идея в том, что вы создали подпрограмму для отправки команды. И это так просто в использовании, поскольку теперь мы можем просто ввести шестнадцатеричную строку (с пробелом между каждым значением). Это выписало бы строку как двоичные значения. И тогда он будет ждать ответа и плюет вам обратно.

0 голосов
/ 07 апреля 2020

Я пытался последовать вашему совету, и он работает для отправки команд. Я пытался написать подпрограмму для strResult

Sub CmdAndResponse(strResult As String)
Dim strBuf  As String
Dim i       As Integer
strBuf = ""
For i = 1 To Len(strResult) Step 3
    strBuf = strBuf & Chr("&H" & Mid(strResult, i, 2))
Next i
Open "COM4: 9600,N,8,1" For Binary As #1
    Put #1, , strBuf
Close #1
End Sub

и подпрограмму, которая вызывает

Sub Ctestres()
Dim strResult As String
strResult = CmdAndResponse("FF A1 00")
MsgBox (strResult) & " " & Len(strResult)
End Sub

, но я получаю ошибку "Ожидаемая функция или переменная".

Если вместо этого я пишу для strResult как функцию, а не как процедуру, ошибки не генерируются, я вижу светодиод RX платы реле, который мигает, но после выполнения strResult не содержит никакого ответа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...