vba - 使用 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 中编写它的方法。
解决方案
首先,您的代码看起来不对。
它可能有效,因为发送 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
因此,这里的想法是您构建了一个例程来发送命令。而且它很容易使用,因为现在我们可以输入一个十六进制字符串(每个值之间有一个空格)。它会将字符串写为二进制值。然后它会等待响应,然后将其吐回给您。
推荐阅读
- c# - 自定义验证属性在客户端不起作用
- ruby-on-rails - 尝试创建新的 rails 5.1.4 项目时出现“找不到 gem”错误
- xcode-ui-testing - 两个模拟器上的单个 UITest 案例
- r - 使用 ggplot2 为并排图添加数据点
- c# - 通过 ClickOnce 部署 CefSharp Winform 并要求 Visual Studio 2019 中的 vc redist - 错误
- c - 程序以 3221225477 退出
- javascript - 如何在 JavaScript 中的同一行上绘制两个移动点
- c# - 传入的模型项是“LoginModel”类型,但此实例需要“HomeViewModel”类型的模型项
- sql - SQL Server:查找非重复项
- c# - 如何获得返回三元组并将其放入三个变量的方法的输出?