首页 > 解决方案 > 使用 VBA 2 读取 COM 端口响应

问题描述

早上好,我想收到来自 COMx 端口的回复,该端口连接了带有 8 个继电器的 RS485 卡,以了解各个继电器的状态。FF 01 01/00我可以使用以下等效于代码的命令发送 ON / OFF 命令。

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 中编写它的方法。

标签: vbams-access

解决方案


首先,您的代码看起来不对。

它可能有效,因为发送 FF 01 01 可能没问题。

但是,您需要文本流中的“/”。

所以,那行代码应该是:

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

或者,由于“/”在 ASCII 中是 47,那么这也可以:

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

并且,HEX 中的 47(一个“/”)是 2F

所以,这会起作用:

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

那么,第二个命令需要什么?

你想输出这个 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

现在,在上面的“/”是问题的一部分。“/”实际上是 ASCII 表中的 47。

所以,上面会写成

FF 01 01 2F 00

所以,我们上面发送的例程是:

子 Ctestwr()

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

End Sub

所以,要发送你的第二个命令,你现在/可以去:

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

现在,一旦上述工作正常,您就可以使用上述内容,或者创建一个发送命令并返回响应的新命令。

所以,你可以去:

 dim strResult   as string

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

因此,这里的想法是您构建了一个例程来发送命令。而且它很容易使用,因为现在我们可以输入一个十六进制字符串(每个值之间有一个空格)。它会将字符串写为二进制值。然后它会等待响应,然后将其吐回给您。


推荐阅读