用MSComm控件写了一个串口通信软件(上位机PC,下位机AT89S52),但是现在改用API写,PC发送和单片机接受都实现了。现在的问题是PC接收。我知道用ReadFile(),但是由于单片机发送数据过来的时机是随机的,我怎么判断何时去读串口呢?有没有类似中断的机制,可以当单片机发送过来数据的时候,执行ReadFile().
请大家多多指教啊。

解决方案 »

  1.   

    if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
    MSComm 的GetCommEvent()函数可以解决你的问题,它一直监视端口,当接收缓冲区内有字符时它的返回值便为2,你便可以调用函数对接收缓冲区内的字符进行接收
    if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
        { 
            variant_inp=m_ctrlComm.GetInput(); //读缓冲区
            safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
            len=safearray_inp.GetOneDimSize(); //得到有效数据长度
            for(k=0;k<len;k++)
                safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
            for(k=0;k<len;k++) 
            {           
             ……
            }
        }
      

  2.   

    谢谢了。但是好像我没有说清楚,用控件的办法我已经会了,但是我现在不用空间,改用WindowsAPI,不知道如何做?
      

  3.   

    那就建立一个线程:
    while(true)
    {
      switch(WorkFlag)
    {
       case CallData:
        下发数据函数:在下发函数中确定下发的RTU站址和命令
       case WaitData:
        检验接收数据,如果正确就WorkFlag=ProcessData;
        否则等待,如果等待tci次还是不正确,就WorkFlag=CallData;
      case ProcessData:
       处理数据;然后WorkFlag=CallData}
      Sleep(1000);
    }
    }