回 帖 发 新 帖 刷新版面

主题:如何检测到 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 40
    
    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 时间值  (这个时间值由发送和接收数据的时间 大概而定)




但是 中间加上的 
sleep 时间值
只是根据波特率和传输数据的个数  大概估计的时间 ,肯定这个估计的时间要比实际所需用的时间 长一些 

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

有没有这样一种方法  

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

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

              2  这个等待函数 是什么?


请指教

回复列表 (共1个回复)

沙发


说明

只要有通讯错误或事件发生时都会产生 OnComm 事件,CommEvent 属性存有该错误或事件的数值代码。要确定引发 OnComm 事件的确切的错误或事件,请参阅 CommEvent 属性。

CommEvent 属性返回下列值之一来表示不同的通讯错误或事件。这些常数可以在该控件的对象库中找到。通讯错误包括下列设置值:

常数 值 描述 
comEventBreak 1001 接收到一个中断信号。 
comEventCTSTO 1002 Clear To Send 超时。在系统规定时间内传输一个字符时,Clear To Send 线为低电平。 
comEventDSRTO 1003 Data Set Ready 超时。在系统规定时间内传输一个字符时,Data Set Ready 线为低电平。 
comEventFrame 1004 帧错误。硬件检测到一帧错误。 
comEventOverrun 1006 端口超速。没有在下一个字符到达之前从硬件读取字符,该字符丢失。 
comEventCDTO 1007 载波检测超时。在系统规定时间内传输一个字符时,Carrier Detect 线为低电平。Carrier Detect 也称为 Receive Line Signal Detect (RLSD)。 
comEventRxOver 1008 接受缓冲区溢出。接收缓冲区没有空间。 
comEventRxParity 1009 奇偶校验。硬件检测到奇偶校验错误 
comEventTxFull 1010 传输缓冲区已满。传输字符时传输缓冲区已满 
comEventDCB 1011 检索端口的设备控制块 (DCB) 时的意外错误 


通讯事件包括下列设置值:

常数 值 描述 
comEvSend 1 在传输缓冲区中有比 Sthreshold 数少的字符。 
comEvReceive 2 收到 Rthreshold 个字符。该事件将持续产生直到用 Input 属性从接收缓冲区中删除数据。 
comEvCTS 3 Clear To Send 线的状态发生变化。 
comEvDSR 4 Data Set Ready 线的状态发生变化。该事件只在 DST 从 1 变到 0 时才发生。 
comEvCD 5 Carrier Detect 线的状态发生变化。 
comEvRing 6 检测到振铃信号。一些 UART(通用异步接收— 传输)可能不支持该事件。 
comEvEOF 7 收到文件结束(ASCII 字符为 26)字符。 


数据类型

Integer

Private Sub MSComm1_OnComm()
 On Error Resume Next
    Dim inData As String '串口接收的数据
    Dim InByte() As Byte '定义一个二进制指针放接收到的数据
    Dim inByte1() As Byte
    
    Select Case MSComm1.CommEvent '选择事件
    Case comEvReceive '接收到字符
       TimeNum = 4 '-----------------赋值计时常量  
        InByte = MSComm1.Input '数据转移到指针


我来回复

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