通讯协议要求是一次发送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 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 
      

  2.   

    Private Sub MSComm1_OnComm() '接收数据 
    Dim strBuff As Variant '*
    Dim BytReceived() As Byte 
    Dim i As Integer  Select Case MSComm1.CommEvent 
        Case comEvReceive '2 
          MSComm1.InputLen = 0
          strBuff = MSComm1.Input 
          BytReceived = strBuff 
     
          For i = 0 To UBound(BytReceived) 
            strData = strData & IIf(strData = "", "", " ") & Right("0" & Hex(BytReceived(i)), 2) 
          Next 
           
          '数据处理代码 
           Text9 = strData 
          strData = "" 
      End Select 
    End Sub 
      

  3.   


    InputLen = 0 不成问题,是将提取的字符数设为缓冲区的全部。
      

  4.   

    comEvReceive 2 
    终于发出去了
      

  5.   

    case 1 改为 case 2
      

  6.   

    你用其他测试软件调试下位机传输上来的数据是否正确?
    还有在发送新数据 Mscomm1.output之前要最好加 MSComm1.InBufferCount = 0 '清空接受缓冲区 
      

  7.   

    我用调试软件调试下位机 :发送的是3C 06 03 02 88 13 01 00 00 00 E3
    返回码:                         BF BF 77 FF BF
    我认为是下位机那边的串口程序本身存在问题。是不是这样?
      

  8.   

    MSComm1.Settings = "9600,n,8,1" 
    看看这个参数和协议是否一样用调试软件连续发送,看下传回来的数据确认下 3C 06 03 02 88 13 01 00 00 00 E3 这串数据是否有误
    也就这些了
      

  9.   

    我连续发送 3C 06 03 02 88 13 01 00 00 00 E3 返回来的码
    顺序:BF BF 77 FF BF
         BF BF 77 FF BF 
         BF BF 77 FF BF
         BF BF 77 FF BF
         BF BF 77 FF BF
         FD BF 77 FF BD
         BF BF 77 FF BD
         BF BF 77 FF BD 
         BF BF 77 FF BD 
         BF BF 77 FF BD 
         BF BF 77 FF BD 
         BF BF 77 FF BD 
         BF BF 77 FF BD 
         BF BF 77 FF BD 
         BF BF 77 FF BD 
         BF BF 77 FF BD 
    这是什么问题呢?
      

  10.   

    补充一点 MSComm1.Settings = "9600,n,8,1" 
    看看这个参数和协议是一样 的
      

  11.   

    将这串数据3C 06 03 02 88 13 01 00 00 00 E3 
    空格去掉,试验下,
    你代码中处理接受数据的时候,是将其连成字符串
    确认下传回来的数据是传byte还是传 string??
      

  12.   

    这个调试软件有选者,忽略空格输入,这个选者9600 N 8 1   选者HEX,就是 输入数据看作16进制字节,不区分大小写
    没有设置返回码是什么形式的选项
      

  13.   

    谢谢各位大侠,特别谢谢of123和Amy_Dream,结帖时一定会把分奉上。我这样说可能太俗了。总之我很感谢大家。我觉得是下位机有问题。现在去查查下位机的问题去了。