通讯协议要求是一次发送11个字节的帧给下位机,如果上位机和下位机通讯上了,下位机会返回一个11个字节的帧。
帧的格式:
             发送顺序  启始字节  从机地址 主机命令 编码地址 参数值 操作字 设定值 校验数据
               数据       3C    1 ~ 31
           发送字节数    1      1           1    1    2   2   2    1
           定义            帧 头                      参数数据              过程数据    帧尾
参数数据(主机命令 编码地址 参数值)
过程数据(操作字 设定值)
例如
范例1:将6号变频器的数字频率(参数P.002)设定为50.00Hz。
主机发送帧:  3C  06  03  02 (88 13)(01 00) (00 00) E3
从机响应帧:  3C  06  01  02 (88 13)(01 00) (00 00) E1 (说明:从机任务正确实现)
3CH是帧 头  06 是从机地址 03是主机命令码 02是参数P.002存储地址  50HZ数据转换50*100=5000=1388H  (01 00)都是控制的操作字/状态字 (00 00)是设定植
以下是我写的程序,调试的时候PC机和下位机通讯不上。请各位专家帮忙解决一下问题(急..................)
Option Explicit
Dim code1() As Byte
Dim strData As String
Dim temp1, temp2, temp3, temp4 As String
Private Sub Command10_Click()
ReDim code1(10)
Dim i As Integer
code1(0) = &H3C
code1(1) = "&H" & Text1 '从机地址,16进制
code1(2) = "&H" & Text2
code1(3) = "&H" & Hex(Text3)
code1(4) = "&H" & temp1
code1(5) = "&H" & temp2
code1(6) = Text5.Text
code1(7) = Text6.Text
code1(8) = "&H" & temp3
code1(9) = "&H" & temp4
code1(10) = (Val(code1(0)) + Val(code1(1)) + Val(code1(2)) + Val(code1(3)) + Val(code1(4)) + _
Val(code1(5)) + Val(code1(6)) + Val(code1(7)) + Val(code1(8)) + Val(code1(9))) Mod 256
MSComm1.Output = code1
End Sub
Private Sub Form_Load()
Dim port As Integer
port = 6
MSComm1.CommPort = port 'COM端口
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.RThreshold = 11 '产生MSComm事件
MSComm1.PortOpen = True
Text1 = "06"
Text2 = "03"
Text3 = "02"
temp1 = "88"
temp2 = "13"
Text5 = "01"
Text6 = "00"
temp3 = "00"
temp4 = "00"
End SubPrivate Sub MSComm1_OnComm() '接收数据
Dim strBuff As String
Dim BytReceived() As Byte
Select Case MSComm1.CommEvent
Case 1
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
Dim i As Integer
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = strData & "0" & Hex(BytReceived(i))
Else
strData = strData & Hex(BytReceived(i))
End If
Next
If Mid(strData, 1, 2) = "3C" And Len(strData) = 22 Then
'数据处理代码
Text9 = strData
strData = ""
End If
End Select
End Sub

解决方案 »

  1.   

    Private Sub Command10_Click()
        ReDim code1(10)
        Dim i As Integer
        code1(0) = &H3C
        code1(1) = Val("&H" & Text1) '从机地址,16进制
        code1(2) = Val("&H" & Text2)
        code1(3) = Val("&H" & Text3)
        code1(4) = Val("&H" & temp1)
        code1(5) = Val("&H" & temp2)
        code1(6) = Val("&H" & Text5)
        code1(7) = Val("&H" & Text6)
        code1(8) = Val("&H" & temp3)
        code1(9) = Val("&H" & temp4)
        code1(10) = (Val(code1(0)) + Val(code1(1)) + Val(code1(2)) + Val(code1(3)) + Val(code1(4)) + _
        Val(code1(5)) + Val(code1(6)) + Val(code1(7)) + Val(code1(8)) + Val(code1(9))) Mod 256
        MSComm1.Output = code1
    End Sub你可找个串口调试软件,发同样的命令来判断. 
      

  2.   

    Private Sub MSComm1_OnComm() '接收数据
        Dim strBuff As String
        Dim BytReceived() As Byte
        Select Case MSComm1.CommEvent
            'Case 1 '发送事件
             Case 2 '或写     Case comEvReceive
            MSComm1.InputLen = 0
            strBuff = MSComm1.Input
            BytReceived() = strBuff
            Dim i As Integer
            For i = 0 To UBound(BytReceived)
                If Len(Hex(BytReceived(i))) = 1 Then
                    strData = strData & "0" & Hex(BytReceived(i))
                Else
                    strData = strData & Hex(BytReceived(i))
                End If
            Next
            If Mid(strData, 1, 2) = "3C" And Len(strData) = 22 Then
            '数据处理代码
             Text9 = strData
            strData = ""
            End If
        End Select
    End Sub