回 帖 发 新 帖 刷新版面

主题:mscomm控件 接收数据结束的标志位是什么

Private Sub Timer1_Timer()
Dim Buffer As Variant
Dim Data() As Byte

Dim i%, j%
Dim xu(0) As Byte '发送缓冲
Dim str As String

   '查询A参数-----------------------------------------------------------------
   
    buff(0) = &H3B
    buff(1) = &H20
    buff(2) = &H11
    i = CRC_CITT(1)
    MSComm1.OutBufferCount = 0  '发送缓冲区的字节数清零

    If MSComm1.PortOpen = True Then
        For i = 0 To 4
            xu(0) = buff(i)
            MSComm1.Output = xu
        Next i
    End If
    sleep 20
    
    Buffer = MSComm1.Input
    Data() = Buffer
    For i = 0 To (UBound(Data) - 19)
    '^^^^^处理第一次通讯的数据
    Next

   
    '----------------------------------------------------------------------------
    

    
    
     '查询    B-----------------------------------------------------------------
   
    buff(0) = &H3B
    buff(1) = &H20
    buff(2) = &H12
    i = CRC_CITT(1)
   MSComm1.OutBufferCount = 0  '发送缓冲区的字节数清零
    
    If MSComm1.PortOpen = True Then
        For i = 0 To 4
            xu(0) = buff(i)
            MSComm1.Output = xu
        Next i
    End If
    
    
    Buffer = MSComm1.Input
    Data() = Buffer
    For i = 0 To (UBound(Data) - 9)
    '处理第二次通讯的数据
   Next
        MSComm1.InBufferCount = 0
End Sub
但是 中间加上的 
sleep 时间值
只是根据波特率和传输数据的个数  大概估计的时间 ,肯定这个估计的时间要比实际所需用的时间 长一些 

这样 因为我的一个 timer 事件中 有许多个查询命令 势必造成 资源的浪费 

有没有这样一种方法  

  当 发送查询命令后,等待 一直到 接收到数据为止  这样 就可以很好地利用时间,而且节省了资源。

现在的疑问是 ;1  如何检测到 接收到了数据,mscomm 控件 有没有检测这一状态的 属性?

              2  这个等待函数 是什么?


请指教

回复列表 (共1个回复)

沙发

查查 SThreshold 属性 和 RThreshold 属性:

----------------------------------
SThreshold 属性
在 MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。

语法

object.SThreshold [ = value ]

Sthreshold 属性语法包括下列部分:

部分 描述 
object 对象表达式,其值是“应用于”列表中的对象。 
value 整形表达式,代表在 OnComm 事件产生之前在传输缓冲区中的最小字符数。 


说明

若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。

如果在传输缓冲区中的字符数小于 value,CommEvent 属性设置为 comEvSend,并产生 OnComm 事件。comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。如果在输出队列中从没有比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。

数据类型

Integer
-----------------------------
RThreshold 属性
在 MSComm 控件设置 CommEvent 属性为 comEvReceive 并产生 OnComm 之前,设置并返回的要接收的字符数。

语法

object.Rthreshold [ = value ]

Rthreshold 属性语法包括下列部分:

部分 描述 
object 对象表达式,其值是“应用于”列表中的对象。 
value 整型表达式,说明在产生 OnComm 事件之前要接收的字符数。 


说明

当接收字符后,若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件。

例如,设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。

数据类型

Integer
--------------------------------

显然只需要设置
Sthreshold=1
Rthreshold=1
然后处理OnComm事件即可。

我来回复

您尚未登录,请登录后再回复。点此登录或注册