头都想痛了,没找出什么原因来!    有一个硬件设备(示波器),需要通过rs232来进行通信,它是命令响应式的,就是发一个命令,就回一个数据包,我用readfile的方式读回来,如果连续两次发送命令过去的话,就会导致第二次发送的命令没响应,必须中间加一个messagebox之类的东西弹出来才能让第二个命令正常回报信息!
 原因大概是那个读写串口的线程借此机会可以处理第二个命令,我用sleep多少秒都没用,一定要messagebox这种中断性质的方式才行! 我试图提高那个读写串口的优先级或者挂起主界面线程,都无济于事!
          
          如果用mscomm控件来做的话,一点问题都没有,但我还是想用api的方式来完成,希望有这方面经验的高手帮我分析一下原因!不胜感谢!

解决方案 »

  1.   

    ReadFile前需要WaitCommEvent,只有在有数据需要读入时才调用ReadFile.
      

  2.   

    SendCmd();
    Read232();
    Sleep
    SendCmd();
    Read232();
    试试
      

  3.   

    网上关于api的例子很多,事件方式的、重叠方式的都有。
    http://www.vckbase.com/code/findcode.asp
      

  4.   

    更正, http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=907
      

  5.   

    readfile之前都肯定是有数据的,因为没有数据的话,会继续等待!
    我的方式就是
    SendCmd();
    Read232();
    Sleep
    SendCmd();
    Read232();
    第二次的 发送指令根本得不到响应,一直等,等几十秒都没用,说明不是时间的问题!
    但是如果把sleep换成MessageBox,就可以了,第二次发送的命令可以得到正确响应!
      
     我觉得问题的关键是这里,为什么sleep和Messagebox会有这种差别,有什么其它的方法完成它吗?我总不可能在测试的过程中,总是让用户点那个MessageBox的确定!
      

  6.   

    Sleep函数执行过程中不会处理Windows消息,请自编一个延时函数试一下,如果不行再想别的路子:
    void Sleep(long lms)
    {
        long lstart=GetTickCount();
        while(GetTickCount()-lstart<lms)
        {
            while(PeekMessage(&msg,NULL,0,0,1))
            {
                //处理消息以使外部程序可以响应事件
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    }
      

  7.   

    既然是命令响应式的,你连发两个命令干吗?
    WriteFile后,等待,ReadFile,再WriteFile,等待,ReadFile