首页 > 解决方案 > 在 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)

如果有人有任何建议,他们将受到欢迎。亲切的问候

标签: excelvbaserial-port

解决方案


推荐阅读