在某个条件下PC机向单片机发送一组数据,MSComm1.Output="!01B2CEC21*",,等单片机响应之后,清空输入缓冲区,过一段时间再发一个命令要求单片机返回一组数据。这个问题有什么方法可以解决呀?

解决方案 »

  1.   

    发完之后再运行下面的延迟函数试一下.Public Sub Delay(PauseTime As Long)
    Dim Start As Single
    Start = Timer 
    Do While Timer < Start + PauseTime
          DoEvents  
    Loop
    End Sub
      

  2.   

    Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)sleep(5000)    '5000毫秒,
      

  3.   

    等单片机响应之后,清空输入缓冲区??????????????????自动的吧规定数据格式吧比如:点灯   灯序号   时间
          01H      02H    02H
    当单片机接收到第一个字节为01H就转到点灯子程序,读取第二个字节表示要点哪个灯,读取第三个字节表示点亮的时间。上面这一组数据就表示把2号灯点亮2秒钟。
      

  4.   

    回复人: tztz520(午夜逛街) ( ) 信誉:100  2004-09-23 10:03:00  得分: 0  
     
     
       发完之后再运行下面的延迟函数试一下.Public Sub Delay(PauseTime As Long)
    Dim Start As Single
    Start = Timer 
    Do While Timer < Start + PauseTime
          DoEvents  
    Loop
    End Sub
      
     
    你指的是哪个发完之后再运行这个程序?
      

  5.   

    回复人: tobetter(豆豆) ( )  我做的是一个电源监控系统,监控单片机的工作状态.通过触发OnComm事件来读取数据的.任务是这样的:我从PC机上通过485发送一组数据给单片机,让单片机按我发送的要求工作,一段时间后,PC机再发送一个命令要求单片机返回单片机的当前工作状态.
      你说的"当你发送完数据后,就直接等待单片机的反馈数据。"这个我知道,我现在是要在中间加一段程序,就是PC机自己发送命令让单片机反馈数据.对于"如果在规定时间里面没有反馈可以提示通信超时。"这个想请教老兄可以怎么实现.还有"用定时器再调用发送函数。"我是不是可以把发送程序放在Timer_Click里就行了?
     
     
        
      

  6.   

    就是你发送一个信息到单片机是要等待它返回的.就在
    MSComm1.Output="!01B2CEC21*"之后执行delay 3   '就等待3秒
      

  7.   

    发送完后用sleep函数等待几秒
    sleep(3000) '3秒
      

  8.   

    我现在举两组数据,比如:一开始PC机向单片机发送一组数据,MSComm1.Output="!01B2CEC21*",等单片机响应之后,过一段时间后,给单片机发出命令要求其返回当前状态,MSComm1.Output="!01M65*",那我应该怎么实现?在这两句之间加延时吗?
      

  9.   

    你说的是不是这个意思:
       向单片机发送命令
       延时
       再向单片机发送命令
       if 在规定的时间内不响应
          超时
       else
          ....
       endif
      

  10.   

    MSComm1.Output="!01B2CEC21*"
    Delay 5
    MSComm1.Output="!01M65*"
      

  11.   

    回复人: poni(poni) ( ) 信誉:100  2004-09-23 14:35:00  得分: 0  
     
     
       你说的是不是这个意思:
       向单片机发送命令
       延时
       再向单片机发送命令
       
    是这个意思,但两次输出缓冲区内的内容是不一样的!!!  它不需要判断第一次发送过去单片机是否响应,而是直接发送命令比如说发送“M”,MSComm1.Output="!01M65*",要球它返回当前状态。
     
      

  12.   

    回复人: tztz520(午夜逛街) ( ) 信誉:100  2004-09-23 14:36:00  得分: 0  
     
     
       MSComm1.Output="!01B2CEC21*"
       Delay 5
       MSComm1.Output="!01M65*"
      
     
    你的这个代码我运行后,5秒后将"!01B2CEC21*!01M65*"一起发送出去.
      

  13.   

    可以用Timer1_timer事件嘛
    把Timer1.Interval设成你想要的时间啊。串口定时发送一般都是这样做的啊
      

  14.   


    Mscomm1.OutBufferCount = 0      '清除发送缓冲区
    MSComm1.Output="..."
    sleep(延迟时间) Mscomm1.InBufferCount = 0       '清除接收缓冲区
     Mscomm1.OutBufferCount = 0      '清除发送缓冲区
    MSComm1.Output="..."
    i=timer '取当前时间
    j=0  '作为判断标志
    do until  timer-i<规定时间  
       if mscomm1.InBufferCount<>0
          j=1
          exit
       endif
    enddo  if j=0
       '超时
    else
       '处理缓冲器数据
    endif
      

  15.   

    回复人: sunny8226(袋鼠) ( ) 信誉:100  2004-09-23 15:01:00  得分: 0  
     
     
       可以用Timer1_timer事件嘛
    把Timer1.Interval设成你想要的时间啊。串口定时发送一般都是这样做的啊
      
     
    我只要发送一次就够了!
      

  16.   

    在MSCOMM控件的ONCOMM事件中得到单片机在什么时候回发信息,然后再发送下一批数据。
      

  17.   

    回复人: clong320(clong320) ( ) 信誉:96  2004-09-23 15:08:00  得分: 0  
     
     
       在MSCOMM控件的ONCOMM事件中得到单片机在什么时候回发信息,然后再发送下一批数据。
      
     
    我不需要知道单片机在什么时候回发信息.给单片机发送反馈数据的命令由PC机控制.
      

  18.   

    前面有个地方错了,
    do until 
       ....
    enddo 应该是  
      do until 
       ....
      loop
      

  19.   

    Public Sub Delay(PauseTime As Long)
    Dim Start As Single
    Start = Timer 
    Do While Timer < Start + PauseTime
          DoEvents  
    Loop
    End Sub
    没错我用的就是他Delay(n)了
      

  20.   


    Mscomm1.OutBufferCount = 0      '清除发送缓冲区
    MSComm1.Output="..."
    sleep(延迟时间) Mscomm1.InBufferCount = 0       '清除接收缓冲区
     Mscomm1.OutBufferCount = 0      '清除发送缓冲区
    MSComm1.Output="..."
    我想问一下给位,延时sleep是不是就使让单片机响应之前PC机发送给单片机的数据呀?等到sleep执行完了,单片机就响应第二次发送给它的数据?  
     
      

  21.   

    我做的是一个电源监控系统,监控单片机的工作状态.通过触发OnComm事件来读取数据的.任务是这样的:我从PC机上通过485发送一组数据给单片机,让单片机按我发送的要求工作,一段时间后,PC机再发送一个命令要求单片机返回单片机的当前工作状态.
    sleep就是执行的让PC机过“一段时间”sleep后,PC机就发送第二帧,等待单片机响应
      

  22.   

    回复人: poni(poni)::
      sleep后,PC机就发送第二帧,等待单片机响应
    也就是我在sleep之前发送给单片机的数据,单片机是收不到的了???
      

  23.   

    发送一次那就再发送并接收正确后把Timer 关掉就好了啊,发送command1
    接收
    打开Timer1发送command2
    接收正确关掉Timer1
      

  24.   

    串口的东西要慢慢调,监视一下你程序中发送、ONCOMM事件触发、接收等几个主要状态,很简单的。
      

  25.   

    回复人: poni(poni)请问怎么调试可以看到第一次发送给单片机的数据?我是说从接受缓冲区中看
      

  26.   

    回复人: poni(poni)我是第一次做这个东西,有很多东西还一点不知道,比如像这个调试,我只知道逐句调试.
      

  27.   

    回复人: poni(poni)可以告诉我一个你的联系方式吗?我想以后有问题的话向你请教!
      

  28.   

    我做过一个和单片机实时通讯的软件用的是定时的收发,这方面的资料你可以去http://www.gjwtech.com/serialcomm.htm看看,或者买人民邮电出版的《VB串口通信工程》看看
      

  29.   

    都是用控件的,有人用过API编写串口通讯程序吗
      

  30.   

    回复人: solidsnake002() 可以有你的联系方式吗?
      

  31.   

    to: gwm_123
        我看了一下上面各位的方法,基本上也就是那几种方式。你发送第一次命令后,可以启动一个定时器。当定时器时间到了,就发送第二个命令,让单片机返回当前状态。至于你说的缓冲区的内容,你可以在找个程序监视,也可以采用两个计算机串口对连的方式。如果需要简单,2、3、5连法就可以。你还可以在发送语句执行前查看当前缓冲区和你即将要发送的数据。