记得书本上说只要将RThreshold值设置为0,就不能引发OnComm事件了,可当我运行程序时为什么还是会
引发OnComm事件呢?请问有什么办法不让OnComm事件发生,我遍的程序中有两个函数,其中一个需要引发
OnComm事件,另一个不需要,可是在运行时都会引发OnComm事件,不知如何解决!

解决方案 »

  1.   

    OnComm 事件
    无论何时当 CommEvent 属性的值变化时,就产生 OnComm 事件,标志发生了一个通讯事件或一个错误。
    语法
    Private Sub object_OnComm ()
    OnComm 事件语法包括下列部分:
    部分 描述 
    object 对象表达式,其值是“应用于”列表中的对象。 
    说明
    CommEvent 属性包含实际错误或产生 OnComm 事件的数码。注意,设置 Rthreshold 或 Sthreshold 属性为 0,分别使捕获 comEvReceive 和 comEvSend 事件无效。
    除了comEvReceive 和 comEvSend 事件外还有其它事件.
    OnComm 常数
    常数 值 描述 
    comEvSend 1 发送事件。 
    comEvReceive 2 接收事件。 
    comEvCTS 3 clear-to-send 线变化。 
    comEvDSR 4 data-set ready 线变化。 
    comEvCD 5 carrier detect 线变化。 
    comEvRing 6 振铃检测。 
    comEvEOF 7 文件结束。LZ,请贴出你的代码.
      

  2.   

    我给出了我编写的OnComm事件的结构,请帮忙分析一下,当我在MSCOM控件的属性中事先设置了RThreshold值为0,
    我会看到Label1中显示了"正在接收数据...",同时Text1的文本框中也显示了接收的字符,这是为什么了呢?
    Private Sub Comm1_OnComm()
    Label1.Caption = " 正在接收数据..."
    Label1.Refresh
    Comm1.RThreshold = 0
    Dim slen%, j%, msgvalue%
    Dim tmp As Variant
    Select Case Comm1.CommEvent
     Case comEvReceive
      slen = Comm1.InBufferCount
      Comm1.InputLen = slen
      ReDim bytInput(slen)
      tmp = Comm1.Input
      bytInput = tmp
      receivedata
      strData = ""
      bytInput = ""
     End Select
    Comm1.RThreshold = 1
    End Subreceivedata是一个处理并显示接收数据的函数,接收是以二进制形式进行的
      

  3.   

    Private Sub Comm1_OnComm()
        Label1.Caption = " 正在接收数据..."
        Label1.Refresh
        Comm1.RThreshold = 0
        Dim slen%, j%, msgvalue%
        Dim tmp As Variant
        Select Case Comm1.CommEvent
            Case comEvReceive
                slen = Comm1.InBufferCount
                Comm1.InputLen = slen
                ReDim bytInput(slen)
                tmp = Comm1.Input
                bytInput = tmp
                receivedata
                strData = ""
                bytInput = ""
        End Select
        Comm1.RThreshold = 1
    End Sub
    LZ,你以下4句代码
         Label1.Caption = " 正在接收数据..."
        Label1.Refresh
        Comm1.RThreshold = 0
        Comm1.RThreshold = 1
    均在
    Select Case Comm1.CommEventEnd Select

    而在
    Private Sub Comm1_OnComm()End Sub

    那就是说,只要串口有其它事件,如
    comEvCTS 3 clear-to-send 线变化。  
    comEvDSR 4 data-set ready 线变化。  
    comEvCD 5 carrier detect 线变化。
    等,
    Comm1.RThreshold = 1
    接下来就发生
    comEvReceive 2 接收事件。
      

  4.   

    不让Comm1_OnComm 接收则加下行
    Comm1.DTREnable = False开始接收
    Comm1.DTREnable = True
      

  5.   

    我这边的电缆线DTR引脚是短接的,没有与对方串口设备相连,4楼的方法能行吗?
    另外,能否按3楼的说法将Comm1.RThreshold = 0 和 Comm1.RThreshold = 1
    放到Select Case 内(如红色代码所示),这样是否在事先设置Comm1.RThreshold = 1
    后才能引发接收事件呢?
    Private Sub Comm1_OnComm()
        Label1.Caption = " 正在接收数据..."
        Label1.Refresh
        Dim slen%, j%, msgvalue%
        Dim tmp As Variant
        Select Case Comm1.CommEvent
            Case comEvReceive
                Comm1.RThreshold = 0
                slen = Comm1.InBufferCount
                Comm1.InputLen = slen
                ReDim bytInput(slen)
                tmp = Comm1.Input
                bytInput = tmp
                receivedata
                strData = ""
                bytInput = ""
                Comm1.RThreshold = 1    End Select  
    End Sub
      

  6.   

    回复6楼:
    我在同一个FORM窗口中编写了一个发送数据的程序和一个接收数据的程序,运行发送程序时使用软件
    握手,并通过自己编写的LOOP循环读取输入缓冲区中的控制码来控制是否继续发送.
    接收数据的程序是通过OnComm() 事件来自动接收缓冲区中的数据,在调试中就发现发送程序和接收
    程序之间互相有干扰,运行发送程序时总是会产生OnComm() 事件,而导致我的LOOP循环无法读取到
    缓冲区中的数据(OnComm() 事件中的接收事件好象抢先一步把缓冲区中的数据读走了)
    因此我想求教如何在运行发送程序功能时,不使OnComm() 事件中的接收事件有效,还请帮忙!