电脑与外接设备是双向通信的, 没有主从关系, 外接设备可以响应电脑指令, 也可以发出指令,
指令长度不一、但是根据协议,在收到第一个字节后, 该指令长度可计算。发出指令取决于用户,
也就是具有时间上的随机性。由于接收指令的随机性, 应该是采用事件驱动方式最好。
但是, 由于对这种方式不是很明白,所以不知该怎样写为最佳
以下是收取指令线程的代码:OVERLAPPED o_read = {0};
o_read.hEvent = CreateEvent(NULL, TRUE, FALSE, "Overlapped_Read");

while(true)
{
   //WaitComm内部调用WaitCommEvent(), 等待的事件为EV_RXCHAR
   if(WaitComm(comm_handle, Max_Interval_Time))
   {
//首先读取一个字符
BYTE id;
DWORD dwread;
if(!ReadFile(comm_handle, &id, sizeof(BYTE), &dwread, &o_read))
{
    if(GetLastError() != ERROR_IO_PENDING)
    {
CloseHandle(o_read.hEvent);
break;
    }
            
            //协议要求, 每字节100ms---Max_Interval_Time
   if(WaitForSingleObject(o_read.hEvent, Max_Interval_Time) != WAIT_OBJECT_0)
   {
PurgeComm(comm_handle, PURGE_RXABORT | PURGE_RXCLEAR);
break;
   }
 }         //初始化指令,及计算长度
Instruction *Inst = new Instruction;
Inst->Format(FALSE, id);         //内部调用ReadFile, 重叠模式
if(!Receive(comm_handle, Inst->GetDataPtr() + 1, Inst->GetLength() - 1))
{
CloseHandle(o_read.hEvent);
break;
}
ResetEvent(o_read.hEvent);
o_read.Internal = o_read.InternalHigh = o_read.Offset = o_read.OffsetHigh = 0;
    }
}由于还没有硬件测试, 所以, 不知代码能不能正常工作,
希望有经验的高手, 把上面有问题的地方, 不对的地方纠正一下另外, 我对这种方式, 也有些迷惑, 那就是每次调用WaitComm(WaitCommEvent)只能等待一个
字符串收到的事件, 随后, 调用Receive(ReadFile)时, 缓冲区可能只有一个字符, 也就是说
可能ReadFile读不到指定长度,  另外,由于ReadFile需要一定的时间, 会不会造成中间有很多
EV_RXCHAR事件丢失, 等死循环回到WaitComm时, 会是一个什么样的情况呢?总之有点乱, 希望高手指点。分不是问题, 本人信誉度高, 呵, 在解决问题后立即结贴, 到目前为止还没有未结贴,:)
可再送100分。

解决方案 »

  1.   

    COMSTAT  stat = {0};
        DWORD error = 0;
        ClearCommError(m_hComHandle, &error, &stat);
        if (stat.cbInQue > 0) // stat.cbInQue 为接收缓冲区的字节数
        {
            // 如果接收缓冲区有数据,则...
        }不知你是不是需要这个
      

  2.   

    这个我还是知道,stat.cbInQue能够准确的反应出缓冲区的字节数目,
    但是WaitCommEvent(事件为EV_RXCHAR)成功后,马上调用ReadFile,
    缓冲区可能也只有那么一两个字节,这就有点麻烦, 一方面, 根据协议,先读一个字节出来,
    ,判断指令的长度,然后,下一个EV_RXCHAR到来,
    ReadFile(handle,buffer,length,&realread,&overlapped), 读到的字节数, 可能会没有计算的length那么多, 同时,又担心有些EV_RXCHAR事件,没有及时处理会丢失。反正思维有些误区, 对串口也不是很熟, 所以, 还望路过的大虾们指点迷津
    给出一个正确的思路。
      

  3.   

    那么就发两次,第一次发几个字节,最好编码(固定长度),存储即将发送的byte长度。
    第二次根据第一次的数据来接收n个byte数据,两次时间间隔不必太长
      

  4.   

    http://www.codeproject.com/system/cserialport.asp