各位大侠:现在小弟遇到一问题需要帮助,请指教一二,小弟不胜感激。我利用MSCOMM控件做数据通讯的程序,其中有收发数据的操作,
我怎么发"680C000000004601040100000000"
对方收到68 0C 00 00 00 00 46 01 04 01 00 00 00 00
现在我发"680C000000004601040100000000"
我现在用串口调试工具十六进制收到:00 F8 78 00 FF 00 00 00 00 00 80 00 78 1E 00 00 E0 00 00 78 00 00 80 00 00 00 00
串口调试工具直接收到 x€xx€
代码如下:在函数中
Dim a As String
a = "680C000000004601040100000000"               
' Modem.Output = a            '终端与主站建立连接后,发初始化报文
Call SENDCCOM(Modem, a)
对应的调用
Public Sub SENDCCOM(Modem As MSComm, mrr As String)
Dim sss() As Byte
Dim i As Integer
Dim l As Integer
Dim X As Integer
Dim Y As Integer
Dim Send_data As Byte
Dim T_len As Integer
Modem.OutBufferCount = 0
Modem.InBufferCount = 0
EVMSG$ = "free!"
If EVMSG$ = "free!" Then
   EVMSG$ = "busy!"
   T_len = Len(mrr)
   For i = 1 To T_len Step 2
     X = Asc(Mid(mrr, i, 1))
     If X < 65 Then
        X = X - 48
     Else
      If X < 97 Then
        X = X - 55
      Else
        X = X - 87
      End If
    End If
    Y = Asc(Mid(mrr, i + 1, 1))
    If Y < 65 Then
       Y = Y - 48
    Else
       If Y < 97 Then
          Y = Y - 55
       Else
          Y = Y - 87
       End If
    End If
    Send_data = X * 16 + Y
    l = ConvertC(ChrB(Send_data), sss)
   'sss = ChrB(Send_data)
     ' Frmss.Text6.Text = Frmss.Text6.Text + "-" + Hex(Send_data)
    Modem.Output = sss
  
    EVMSG$ = "free!"
  Next i
Else
  MsgBox "串口正忙,发送错误"
End IfEnd Sub

解决方案 »

  1.   

    ' Modem.Output = a            '终端与主站建立连接后,发初始化报文  (已经注释掉)
      

  2.   

    ConvertC()是什么?
    你是想680C000000004601040100000000 这个当做字符串发送还是二进制式发送
    如果你是以二进制方式,你应该定义一个Byte数组,然后将将它们放在这个数组里
    比如dim bin(xx) as byte 'xx是你的长度
    bin(0)=&H68
    bin(1)=&hc0
    ....如果你是以字符方式发送的话,应该先将这个字符串转化为ANSI编号字串
    dim bin() as byte 
    bin=strconv("68C0...",vbfromunicode) 'vbfromunicode 好像是这样拼写的两种方式都是同一种发送方法,就是
     Modem.Output  =bin
      

  3.   

    mscomm1.inputmode = 1   ' bin 模式public bytSendData() as byteredim bytSenddata (13)
    bytSendData(0) = &H68
    bytSendData(1) = &H0C
    ....
    bytSendData(13) = &h00mscomm1.output = bytSendData   ' 16进制发送
      

  4.   

    真的不知道你这段代码有什么用:
    T_len = Len(mrr)
       For i = 1 To T_len Step 2
         X = Asc(Mid(mrr, i, 1))
         If X < 65 Then
            X = X - 48
         Else
          If X < 97 Then
            X = X - 55
          Else
            X = X - 87
          End If
        End If
        Y = Asc(Mid(mrr, i + 1, 1))
        If Y < 65 Then
           Y = Y - 48
        Else
           If Y < 97 Then
              Y = Y - 55
           Else
              Y = Y - 87
           End If
        End If
        Send_data = X * 16 + Y
        l = ConvertC(ChrB(Send_data), sss)'你既然是直接传一个十六进制的字符串(设置Modem为二进制式传输方式),可这样写:
    Public Sub SENDCCOM(Modem As MSComm, mrr As String)
    Dim ii As Integer,bytSendData() as Byte,jj As Integer
    Redim bytSendData(Len(mrr)/2-1)
    jj =1
    For ii=0 to Ubound(bytSendData)
        bytSendData(ii)=CInt("&H" & Mid(mrr,jj,2))
        jj =jj +2
    Next iiModem.Output = bytSendData
    End Sub
      

  5.   

    请检查你MSComm控件的属性Settings 设置是否与串口调试工具一致。