串口的读问题

大头猫 2011-05-29 09:06:22
DWORD WINAPI CommWatchProc1(LPVOID lpParameter)
{
while(m_bCom1Open==true)
{
DWORD dwBytesRead=1024;
DWORD dwEvtMask=0;
OVERLAPPED READ_OS;
//存储读到的数据
char lpInBuffer[1024];
COMSTAT ComStat;
DWORD dwErrorFlags;
//保存串口数据的长度
DWORD dwLength;
SetCommMask( hCom1, EV_RXCHAR|EV_TXEMPTY );//有哪些串口事件需要监视?
WaitCommEvent( hCom1, &dwEvtMask, 0 );// 等待串口通信事件的发生
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
::ClearCommError(hCom1,&dwErrorFlags,&ComStat);
dwLength=ComStat.cbInQue; //输入缓冲区有多少数据?
if (dwLength> 0)
{
BOOL fReadStat;
dwBytesRead=min(dwBytesRead,dwLength);
fReadStat=ReadFile(hCom1,lpInBuffer,dwLength,&dwBytesRead,&READ_OS);
if (!fReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(hCom1,&READ_OS,&dwBytesRead,TRUE);

}
}

}
}
}

return 0;
}

检测得到写入串口数据的长度,但是没法写进lpInBuffer,希望有人能解
...全文
93 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nalisaki 2011-05-30
  • 打赏
  • 举报
回复
当读取不成功时,是不是要用一个循环等待一下,直到读取完成呢?
BOOL f;
f = ReadFile(p->m_hCom,buffer,comState.cbInQue,&data,&over);
if(!f)
{
BOOL m;
m = GetOverlappedResult(p->m_hCom,&over,&written,true);
while(!m)
{
if(GetLastError() == ERROR_IO_PENDING)
{
m = GetOverlappedResult(p->m_hCom,&over,&written,true);
}
}

}
nalisaki 2011-05-30
  • 打赏
  • 举报
回复
使用READ_OS前要memset(&READ_OS,0,sizeof(OVERLAPPED));
大头猫 2011-05-29
  • 打赏
  • 举报
回复
要吧,不然你怎么知道等待那些消息呢,那个ReadFile 的返回类型是false,我不知道是那种问题
czydxj 2011-05-29
  • 打赏
  • 举报
回复
SetCommMask串口设置不应该放在这里吧

2,641

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧