当前位置:编程学习 > VB >>

串口通信问题的模拟与实际怎么不一致?

我编写了一个串口通信程序,和串口调试助手可以正常通信。但是连接上实际的设备之后无法通信,是哪的问题请大家帮忙解决一下!不胜感激. --------------------编程问答-------------------- http://download.csdn.net/detail/veron_04/1262066 --------------------编程问答-------------------- 我这个也试过了,可以和我编写的通信,可以和串口调试助手通信,但是连接上实物也不好使。(我用别的已经试过了通信连接绝对没有问题!) --------------------编程问答-------------------- 怎么我看不到你的代码呀? --------------------编程问答-------------------- --------------------编程问答-------------------- 可以与串口调试助手通信 与可以与实物通信时不一样的啊

首先串口调试助手通信,不会显示换行符,回车符等等的特殊符号,你的实物可能需要作为停止符

第二,你应该是用串口调试助手通信发送给实物,看看是否得到实物的响应;在用自己的程序发送给调试助手,看看是不是一模一样的设置与内容

--------------------编程问答-------------------- 串口调试助手不是跑在PC机上的吗?你的程序和这个能正常通讯?
--------------------编程问答-------------------- --------------------编程问答-------------------- 好象是因为PC机只识别16进制数据的原因! --------------------编程问答-------------------- 这个原因我找到了,只是16进制的发送和接收,例如:11 22 1a 2e 3f......这只接受和发送怎么编程!中间还要用空格隔开。我试了很多都不能用!我先试试(贝隆)的,看能不能用.
--------------------编程问答-------------------- 我用的是模拟串口,将两个串口接通! --------------------编程问答-------------------- 那你发送时不要用文本模式啊,用数位模式啊 comInputModeBinary --------------------编程问答-------------------- Output 属性可以传输文本数据或二进制数据。用 Output 属性传输文本数据,必须定义一个包含一个字符串的 Variant。发送二进制数据,必须传递一个包含字节数组的 Variant 到 Output 属性。

正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等等的数据,要以二进制形式发送。
--------------------编程问答-------------------- 改成二进制形式了!16进制接收发送,模拟可以,实际还是通不上,悲催! --------------------编程问答-------------------- 不明白你什么意思?  就是说你用调试助手就能跟下位机通信??
程序就不行??  是收不到还是发不到?? --------------------编程问答-------------------- 恩,使用助手选择16进制就可以正常通信,用程序就不行,我也不清楚是收不到还是发不到,因为用程序就没反应! --------------------编程问答--------------------   MSComm1.Output = Trim(Textsend.Text)
这句要改,你一个字一个字地获取,然后一个一个地转成 byte型 再一个个地发送


或者直接发送 MSComm1.Output = Chr(&H5) & Chr(&H52) & Chr(&H1) & Chr(&H3) & Chr(&H0) & Chr(&H1) & Chr(&H4) & Chr(&H50) --------------------编程问答-------------------- 嗯,这样改了,改成字节形式接收了。现在变成打开串口时,显示无效串口8002了,我再检查下看哪又出问题了! --------------------编程问答-------------------- 改了后的程序拿出来看看,跟打开串口怎么会有关系呢,一定是你串口被占用或者改了端口号 --------------------编程问答-------------------- 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无效的串口!不知道是怎么回事。 --------------------编程问答--------------------   Frm2.MSComm1.InputMode = comInputModeBinary '以文本方度接收
  Frm2.MSComm1.RThreshold = 1 '产生MSComm事件

这些东西放在打开串口之前设置试试看 


sj(i / 3) = Val("&H" & Mid(sj_Txt, i + 1, 2))

这句不妥 Val 返回的是一个double吧(我忘记了是什么类型了)
你最好确保它是byte的输出 --------------------编程问答-------------------- 嗯,好的,我试试! --------------------编程问答-------------------- 和串口助手已经能通信,说明的的下位机软硬件都没有问题了,问题肯定是出在电脑端的串口访问程序上 --------------------编程问答-------------------- 没有和下位机握手 --------------------编程问答--------------------  OutputSignal = TxtSend.Text 和output=txtSend.text有区别吗?在别人的代码里看到这个和我的不一样,别人的可以和下位机通信! --------------------编程问答-------------------- 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 --------------------编程问答-------------------- 做小程序玩玩可以,如果你真想把这种东西运用到工程里,建议换 VC 来做把,这种建议是有依据的,不相信你可以看看你在搞平凡的串口通讯时的 CPU 占用率就明白了。如果工程中同时还需要处理图形、网络、数据库等资源,这样的工程是没法继续下去的。建议采用多线程处理方案,但因为 VB 对多线程处理起来比较复杂,很难做到兼容性、稳定性比较好的程度,所以建议使用 C 语言来开发,效率高,稳定性也不错。
你可以参考我的这个例子,其实也是很简单的,我还用了很多 VB 的开发思路进去,你应该能看懂。最重要的是实现了多线程,比用 Microsoft 的控件效率高很多,在几年前的电脑上跑,这种技术 CPU 占用峰值也就是1%,通常是看不出有什么占用率,为同样是 VC ,跑 Microsoft 的控件,CPU 占用峰值可以跑到 100%,通常是 80% 以上,所以这种方案的效率是很不错的,你可以看一下。
http://download.csdn.net/detail/SupermanKing/2690778 --------------------编程问答-------------------- 嗯,主要我是学硬件的,自学了一点VB,怕自己编程基础不够啊!许多软件方面东西都不怎么懂,所以不太敢碰。呵呵! --------------------编程问答-------------------- C语言倒是学了点,但是实际中根本没用过。感觉会写点程序,但是除了单片机其他根本就没用过。 --------------------编程问答-------------------- 还有 今天我也试过一个测量仪器通信, 发觉要有开始信号和结束信号 最后还要一个BCC校验码(按位取XOR)

后来经过试验 只需要output= CHR(2) & data & chr(3)&"00" 就行了,根本不需要正确的BCC校验码,但是没有这两个00就是不行     

看看对楼主有没有启示?

其实很多向仪器发送单个字符 也是按ASCII码相对应的16进制发送的啊,不需要特别发送16进制 --------------------编程问答--------------------
引用 28 楼  的回复:
C语言倒是学了点,但是实际中根本没用过。感觉会写点程序,但是除了单片机其他根本就没用过。

用过单片机写mcu上的程序你应该更加容易写pc的程序呀,看看我给你的例子你应该能理解的。 --------------------编程问答--------------------
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,