我编写了一个串口通信程序,和串口调试助手可以正常通信。但是连接上实际的设备之后无法通信,是哪的问题请大家帮忙解决一下!不胜感激.

解决方案 »

  1.   

    http://download.csdn.net/detail/veron_04/1262066
      

  2.   

    本帖最后由 bcrun 于 2012-09-19 10:29:38 编辑
      

  3.   

    本帖最后由 bcrun 于 2012-09-19 10:30:35 编辑
      

  4.   

    这个原因我找到了,只是16进制的发送和接收,例如:11 22 1a 2e 3f......这只接受和发送怎么编程!中间还要用空格隔开。我试了很多都不能用!我先试试(贝隆)的,看能不能用.
      

  5.   

    那你发送时不要用文本模式啊,用数位模式啊 comInputModeBinary
      

  6.   

    Output 属性可以传输文本数据或二进制数据。用 Output 属性传输文本数据,必须定义一个包含一个字符串的 Variant。发送二进制数据,必须传递一个包含字节数组的 Variant 到 Output 属性。正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等等的数据,要以二进制形式发送。
      

  7.   

      MSComm1.Output = Trim(Textsend.Text)
    这句要改,你一个字一个字地获取,然后一个一个地转成 byte型 再一个个地发送
    或者直接发送 MSComm1.Output = Chr(&H5) & Chr(&H52) & Chr(&H1) & Chr(&H3) & Chr(&H0) & Chr(&H1) & Chr(&H4) & Chr(&H50)
      

  8.   

    Private Sub Form_Load()
         TextCL.Visible = False
       
        
          
         
    If Combo1.Text = "COM1" Then
        Frm2.MSComm1.CommPort = 1
    End If
    If Combo1.Text = "COM2" Then
        Frm2.MSComm1.CommPort = 2
    End If
    If Combo1.Text = "COM3" Then
        Frm2.MSComm1.CommPort = 3
    End If
    If Combo1.Text = "COM4" Then
        Frm2.MSComm1.CommPort = 4
    End If
    If Combo2.Text = "2400" Then
        Frm2.MSComm1.Settings = "2400,n,8,1"
    End If
    If Combo2.Text = "4800" Then
        Frm2.MSComm1.Settings = "4800,n,8,1"
    End If
    If Combo2.Text = "9600" Then
        Frm2.MSComm1.Settings = "9600,n,8,1"
    End If
    If Combo2.Text = "14400" Then
        Frm2.MSComm1.Settings = "14400,n,8,1"
    End If
    If Combo2.Text = "155200" Then
        Frm2.MSComm1.Settings = "155200,n,8,1"
    End If
    End Sub下面石达开串口的:
    Private Sub Commddkck_Click()
         If Frm2.MSComm1.PortOpen = False Then      Frm2.MSComm1.PortOpen = True  '打开通信口   Commddkck.Caption = "关闭串口"
       shpconnect.FillColor = &HFF&
        
    ElseIf MSComm1.PortOpen = True Then    Frm2.MSComm1.PortOpen = False  '关闭通信口   Commddkck.Caption = "开启串口"
      shpconnect.FillColor = &HFF00&
     End If    Frm2.MSComm1.InputMode = comInputModeBinary  '以文本方度接收
        Frm2.MSComm1.InBufferCount = 0   '清空接受缓冲区
        Frm2.MSComm1.OutBufferCount = 0  '清空传输缓冲区
        Frm2.MSComm1.RThreshold = 1      '产生MSComm事件
    End Sub接收的:
    Dim strBuff As String
        Select Case MSComm1.CommEvent
            Case 2
                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
        Textreceive.Text = strData
        TextCL.Text = strData            lenInput = Len(strData)
                 
                'Text2 = lenInput \ 2
                '数据处理代码
        End Select
    发送的:
    Private Sub Command1_Click()  ' 发送
            If Textsend.Text = "" Then
             MsgBox "发送的数据不能为空!", vbOKOnly, 16
             Exit Sub
          End If
     Dim sj() As Byte
         Dim sj_Txt As String
         Dim i As Integer
         sj_Txt = Textsend
         If (Len(Textsend) Mod 3 = 0) Or ((Len(Textsend) + 1) Mod 3 = 0) And Len(Textsend) <> 0 Then '检验16进制字符串长
             ReDim sj(Len(sj_Txt) / 3 - 1)
             For i = 0 To Len(sj_Txt) Step 3
                sj(i / 3) = Val("&H" & Mid(sj_Txt, i + 1, 2))
             Next
             If MSComm1.PortOpen = True Then
                 MSComm1.Output = sj
             Else
                 MSComm1.PortOpen = True             MSComm1.Output = sj
             End If
          Else
             MsgBox ("格式不对!")
         End If       
    End Sub
    现在是明显串口是存在的,把本本上的USB转串口都不用了!直接在台式上实验,提示8002无效的串口!不知道是怎么回事。
      

  9.   

      Frm2.MSComm1.InputMode = comInputModeBinary '以文本方度接收
      Frm2.MSComm1.RThreshold = 1 '产生MSComm事件这些东西放在打开串口之前设置试试看 
    sj(i / 3) = Val("&H" & Mid(sj_Txt, i + 1, 2))这句不妥 Val 返回的是一个double吧(我忘记了是什么类型了)
    你最好确保它是byte的输出
      

  10.   

     OutputSignal = TxtSend.Text 和output=txtSend.text有区别吗?在别人的代码里看到这个和我的不一样,别人的可以和下位机通信!
      

  11.   

    Private Sub Form_KeyPress (KeyAscii As Integer)
       Dim Buffer as Variant
       
       ' 设置并打开窗口
       MSComm1.CommPort = 1
       MSComm1.PortOpen = True   Buffer = Chr$(KeyAscii)
       MSComm1.Output = Buffer
    End Sub
    这是msdn的例子, 没查到什么OutputSignal
      

  12.   

    做小程序玩玩可以,如果你真想把这种东西运用到工程里,建议换 VC 来做把,这种建议是有依据的,不相信你可以看看你在搞平凡的串口通讯时的 CPU 占用率就明白了。如果工程中同时还需要处理图形、网络、数据库等资源,这样的工程是没法继续下去的。建议采用多线程处理方案,但因为 VB 对多线程处理起来比较复杂,很难做到兼容性、稳定性比较好的程度,所以建议使用 C 语言来开发,效率高,稳定性也不错。
    你可以参考我的这个例子,其实也是很简单的,我还用了很多 VB 的开发思路进去,你应该能看懂。最重要的是实现了多线程,比用 Microsoft 的控件效率高很多,在几年前的电脑上跑,这种技术 CPU 占用峰值也就是1%,通常是看不出有什么占用率,为同样是 VC ,跑 Microsoft 的控件,CPU 占用峰值可以跑到 100%,通常是 80% 以上,所以这种方案的效率是很不错的,你可以看一下。
    http://download.csdn.net/detail/SupermanKing/2690778
      

  13.   

    还有 今天我也试过一个测量仪器通信, 发觉要有开始信号和结束信号 最后还要一个BCC校验码(按位取XOR)后来经过试验 只需要output= CHR(2) & data & chr(3)&"00" 就行了,根本不需要正确的BCC校验码,但是没有这两个00就是不行     看看对楼主有没有启示?其实很多向仪器发送单个字符 也是按ASCII码相对应的16进制发送的啊,不需要特别发送16进制
      

  14.   

    用过单片机写mcu上的程序你应该更加容易写pc的程序呀,看看我给你的例子你应该能理解的。