如何判断串口数据接收结束?

godzhwei 2008-07-08 05:01:11

while (true)
{
ClearCommError(hCom, &dwError, &cs);
WaitCommEvent (hCom,&dwEvtMask,NULL);
if (dwEvtMask&EV_RXCHAR== EV_RXCHAR)
{
if(cs.cbInQue==0)
{
ReadFile(hCom,cTemp,nRecv,&iTemp,NULL);
break;
}
}
if(GetTickCount()>=dwTimeOut)
{
return FALSE;
}
Sleep(50);
}
从串口接收的数据长度长短不一,应该如何判断数据接收完毕咯??
上面的代码我网上找的试试好像不行,dwEvtMask&EV_RXCHAR== EV_RXCHAR这表达式怎么理解啊?
还有ReadFile函数里面的nRecv参数在这里应该设为多少的?我不知道将要接收的数据长度有多大啊。。。希望各位帮帮忙啊,谢谢!
...全文
2896 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
godzhwei 2008-07-18
  • 打赏
  • 举报
回复
谢谢各位关注了!
godzhwei 2008-07-16
  • 打赏
  • 举报
回复
引用 19 楼 rayland 的回复:
引用 11 楼 godzhwei 的回复:
C/C++ codewhile (true)
{
ClearCommError(hCom, &dwError, &cs);
if (cs.cbInQue)
{
ReadFile(hCom,cTemp,1,&iTemp,NULL);
memcpy(buf+nRecv,cTemp,iTemp);
nRecv+=iTemp;
}
if (cTemp[0]==0x0d)
{
break;
}
}


C/C++ code
bool bEnd = fals…


这代码我试下好像行不通。。。lpRec += dwOneRead;这句,lpRec不能为左值吧?
for( ptemp = lpRec-dwOneRead; *ptemp != '\0'; ptemp++ )
{
if( *ptemp == 0x0d )
{
bEnd = true;
break;
}
}
你这个判断退出的话当0x0d后面刚好还有数据的话不就也存入lpRec了?
wqm_44944 2008-07-16
  • 打赏
  • 举报
回复
你接收的数据长度知道吗?如果你能计算出来,你可以通过cs.cbInQue 来判断是否是全部接收。
Eleven 2008-07-16
  • 打赏
  • 举报
回复
Up....
godzhwei 2008-07-15
  • 打赏
  • 举报
回复
谁来看下上面那代码,该怎么改好??
liu443 2008-07-15
  • 打赏
  • 举报
回复
我说的cmscomm问题就是在该函数同一文件内的地方调用该函数没有问题的,在别的文件内调该函数就跳出错误
错误在setoutput();
godzhwei 2008-07-14
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 rayland 的回复:]
引用 11 楼 godzhwei 的回复:
C/C++ codewhile (true)
{
ClearCommError(hCom, &dwError, &cs);
if (cs.cbInQue)
{
ReadFile(hCom,cTemp,1,&iTemp,NULL);
memcpy(buf+nRecv,cTemp,iTemp);
nRecv+=iTemp;
}
if (cTemp[0]==0x0d)
{
break;
}
}


C/C++ code
bool bEnd = fals…
[/Quote]

这代码我试下好像行不通。。。lpRec += dwOneRead;这句,lpRec不能为左值吧?
for( ptemp = lpRec-dwOneRead; *ptemp != '\0'; ptemp++ )
{
if( *ptemp == 0x0d )
{
bEnd = true;
break;
}
}
你这个判断退出的话当0x0d后面刚好还有数据的话不就也存入lpRec了?
godzhwei 2008-07-11
  • 打赏
  • 举报
回复
恩,延时也差不多吧呵呵!还有像我上面发的代码这样子思路行吗?判断有字节进入串口了,然后当cs.cbInQue==0表明没字节了说明接收完毕?
dirdirdir3 2008-07-11
  • 打赏
  • 举报
回复
自己定义一个包,包头包含长度,包尾校验一下就可以.........
taskvip 2008-07-11
  • 打赏
  • 举报
回复
用超时来处理,多久没有接收到字符就了认为是结束了。
godzhwei 2008-07-11
  • 打赏
  • 举报
回复
额。。。看来也没什么办法吧
godzhwei 2008-07-11
  • 打赏
  • 举报
回复
周末了,礼拜一再来看!
rayland 2008-07-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 godzhwei 的回复:]
C/C++ codewhile (true)
{
ClearCommError(hCom, &dwError, &cs);
if (cs.cbInQue)
{
ReadFile(hCom,cTemp,1,&iTemp,NULL);
memcpy(buf+nRecv,cTemp,iTemp);
nRecv+=iTemp;
}
if (cTemp[0]==0x0d)
{
break;
}
}
[/Quote]

bool bEnd = false;
ClearCommError(m_hCom, &dwErrorFlags, &ComStat );
if( 0 != ComStat.cbInQue )
{
if(ReadFile(m_hCom,lpRec,ComStat.cbInQue,&dwOneRead,NULL))
{
lpRec += dwOneRead;
*lpRec = '\0' ; //添加字符串结尾符

//依次查找接收到的数据,直到找到 结尾标志符号。
for( ptemp = lpRec-dwOneRead; *ptemp != '\0'; ptemp++ )
{
if( *ptemp == 0x0d )
{
bEnd = true;
break;
}
}
}
}
wanshi131 2008-07-10
  • 打赏
  • 举报
回复
这要看你的协议是怎么定的
你也可以在协议开头加上数据大小啊,然后再读相应大小的数据
godzhwei 2008-07-10
  • 打赏
  • 举报
回复
只有通过读取每个字节才能判断数据是否接收完毕吗?还有别的什么好办法么?来人讨论讨论啊~~
jyh_baoding 2008-07-09
  • 打赏
  • 举报
回复
只有接收成功啊,只要你没有关闭,随时可能接收数据啊!
用户 昵称 2008-07-09
  • 打赏
  • 举报
回复
先直接用pc判断,不行的话再想办法。
用户 昵称 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 godzhwei 的回复:]
数据结束符是0x0d。逐个字节比较不是速度超慢吗?
[/Quote]

不会的,PC的计算能力是远超串口的,如果有两个线程,一个不管计算只管收,另一个只管计算,应该可以胜任。
godzhwei 2008-07-09
  • 打赏
  • 举报
回复
数据结束符是0x0d。逐个字节比较不是速度超慢吗?
qaz2008 2008-07-09
  • 打赏
  • 举报
回复
你的数据中是否会出现0x0d,如果不会可以逐个字节或字比较!!!
加载更多回复(8)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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