excel - 在 VBA Excel 中将带有十六进制命令的字符串发送到串行端口
问题描述
首先感谢您花时间阅读我的问题。任何意见,将不胜感激。我目前正在 Excel 中处理 VBA 项目。我已经完成了大部分项目,但被困在一个明显的小路障上。一点背景故事。我正在编写一个 Excel 代码以通过 CANUSB 与 PWM 发生器进行通信。该设备通过 USB 连接到计算机并充当虚拟 COM 端口。我必须向它发送一个预先配置/预先确定的命令来激活 PWM。我首先在使用相关 com 设置连接到终端 Putty 时测试了我的命令。该设备正在使用终端腻子,但是当我发送相同的命令时,例如:t02180002F4012C01B80B(这里只有第一个字符是“t”,其余的都应该是十六进制)设备/CANUSB不发送命令到脉宽调制。我在这里看到的唯一问题是,当终端 Putty 正确解释或传递命令时,excel vba 程序要么将其转换为其他内容,要么不发送正确的字符串。我也尝试将十六进制转换为字符,并作为字符串发送。关于我应该发送的命令的一些细节。第一个字符总是 t,后面跟着一个 8 字节大小的十六进制命令(即每个字节在程序中作为十六进制命令写入)。这是我的一些代码(用于发送,使用的其他选项标记为注释):并作为字符串发送。关于我应该发送的命令的一些细节。第一个字符总是 t,后面跟着一个 8 字节大小的十六进制命令(即每个字节在程序中作为十六进制命令写入)。这是我的一些代码(用于发送,使用的其他选项标记为注释):并作为字符串发送。关于我应该发送的命令的一些细节。第一个字符总是 t,后面跟着一个 8 字节大小的十六进制命令(即每个字节在程序中作为十六进制命令写入)。这是我的一些代码(用于发送,使用的其他选项标记为注释):
Private Sub PWM_cmd_Send(ByVal cmd As String)
'I was first defining it as string then tried defining it as Variant
Dim Hex_Cmd As Variant
'Tried sending the direct whole command as input
If cmd = "Push" Then
Hex_Cmd_Final = "t02180002F4012C01B80B"
'Another way of setting the command that didnt work
'Hex_Cmd_Final = "t" & Chr(&H2) & Chr(&H18) & "0" & Chr(&H0) & "0" & Chr(&H2) & Chr(&HF4) & Chr(Hex_Cmd) & "0" & Chr(&H1) & Chr(&HB8) & "0" & Chr(&HB)
'Another option that didnt work
'Hex_Cmd_Final = Chr("t") + &H0 + &H2 + &H1 + &H8 + &H0 + &H0 + &H0 + &H2 + &HF + &H4 + &H0 + &H1 + &H0 + &H2 + &HC + &H0 + &H1 + &HB + &H8 + &H0 + &HB + vbCr
ElseIf cmd = "Pull" Then
Hex_Cmd_Final = "t02180001F4012C01B80B" + vbCr
'Hex_Cmd_Final = Chr("t") + &H0 + &H2 + &H1 + &H8 + &H0 + &H0 + &H0 + &H1 + &HF + &H4 + &H0 + &H1 + &H0 + &H2 + &HC + &H0 + &H1 + &HB + &H8 + &H0 + &HB + vbCr
'Hex_Cmd_Final = "t" & "0" & Chr(&H2) & Chr(&H18) & "0" & Chr(&H0) & "0" & Chr(&H1) & Chr(&HF4) & Chr(Hex_Cmd) & "0" & Chr(&H1) & Chr(&HB8) & "0" & Chr(&HB)
Else
MsgBox ("Something is wrong, command not being read correctly")
End If
'The command message is then sent over to another sub to be fowarded
'to the Virtual Com Port.
PWMcmdSend_Default (Hex_Cmd_Final)
End Sub
过程 PWMcmd_Default 使用
mclsComm2.Senden (cmd)
依次使用以下代码行发送命令(取自模块文件中定义的 senden 函数)
' Text senden
abyteBuffer = StrConv(Text, vbFromUnicode)
lngRet = WriteFile(mlngComHandle, VarPtr(abyteBuffer(0)), Len(Text), lngWritten, 0)
如果有人有任何建议,他们将受到欢迎。亲切的问候
解决方案
推荐阅读
- c# - 在 C# 中将具有未知分隔符和可选时间元素的年/月/日字符串解析为 DateTime
- javascript - 如何获取 css 属性并通过 javascript 更改 html 元素的高度
- html - CSS-头像随机改变大小
- python-3.x - 如何创建多维字典
- java - Java 泛型 - 不兼容的界限
- javascript - 如何绑定对象的动态输入框数组
- reactjs - React Native Debugger:为什么我不能在我的 Redux 传奇中设置断点?
- selenium - Internet Explorer WebDriver 在 CreateSession API 调用期间挂起一小时
- ruby-on-rails - 如何在 Rails 6 中使用第二个数据库
- node.js - 什么是 Node.js Buffer.from(string) 的 Deno 等价物