电脑与外接设备是双向通信的, 没有主从关系, 外接设备可以响应电脑指令, 也可以发出指令,
指令长度不一、但是根据协议,在收到第一个字节后, 该指令长度可计算。发出指令取决于用户,
也就是具有时间上的随机性。由于接收指令的随机性, 应该是采用事件驱动方式最好。
但是, 由于对这种方式不是很明白,所以不知该怎样写为最佳
以下是收取指令线程的代码: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分。
指令长度不一、但是根据协议,在收到第一个字节后, 该指令长度可计算。发出指令取决于用户,
也就是具有时间上的随机性。由于接收指令的随机性, 应该是采用事件驱动方式最好。
但是, 由于对这种方式不是很明白,所以不知该怎样写为最佳
以下是收取指令线程的代码: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分。
DWORD error = 0;
ClearCommError(m_hComHandle, &error, &stat);
if (stat.cbInQue > 0) // stat.cbInQue 为接收缓冲区的字节数
{
// 如果接收缓冲区有数据,则...
}不知你是不是需要这个
但是WaitCommEvent(事件为EV_RXCHAR)成功后,马上调用ReadFile,
缓冲区可能也只有那么一两个字节,这就有点麻烦, 一方面, 根据协议,先读一个字节出来,
,判断指令的长度,然后,下一个EV_RXCHAR到来,
ReadFile(handle,buffer,length,&realread,&overlapped), 读到的字节数, 可能会没有计算的length那么多, 同时,又担心有些EV_RXCHAR事件,没有及时处理会丢失。反正思维有些误区, 对串口也不是很熟, 所以, 还望路过的大虾们指点迷津
给出一个正确的思路。
第二次根据第一次的数据来接收n个byte数据,两次时间间隔不必太长