请教win32 API串口编程检测数据丢失的办法
单片机通过串口要往PC传送大量数据,把数据分成定长的包往上发,有包头和包尾,上位机接收以后发现没问题就让下位机继续发,有问题就让下位机重发。现在的问题就是定长的数据偶尔会丢失,在win32 API的串口程序中有没有什么办法检测数据丢失了。是不是通过超时设置函数SetCommTimeouts来处理的?如果是的话,具体是怎么处理的。如果不是,那用什么办法来检测下位机有数据没发上来呢。 本帖最后由 mingqiang 于 2013-2-22 14:35 编辑因为数据包是定长的,如果发上来的数据长度不够,就一直等着下位机发数据上来,接收够了上位机才会做出相应的处理。如果数据已经发完,但是发送的过程中丢失了数据,那么上位机就一直在傻等下位机的数据,而下位机也一直傻等上位机的指令。我现在就是想检测出数据丢失,然后上位机让下位机重发。 楼主能不能给个例子,我串口接收老是出问题 PC编程有个超时的概念,应用一下吧,楼主! 我也是参考的lishaoan的例子,网上一搜一大把。 收到一个字节后就启动定时器计时呗,超时了就重发,和单片机下的串口收发思路一致。 真实串口还是转的?数据长度一帧多少 mcu_lover 发表于 2013-2-22 14:48 static/image/common/back.gif
收到一个字节后就启动定时器计时呗,超时了就重发,和单片机下的串口收发思路一致。 ...
用time.h中的clock函数定时,超过指定时间就重发? 68336016 发表于 2013-2-22 14:48 static/image/common/back.gif
真实串口还是转的?数据长度一帧多少
真实串口,数据长度一帧642字节。下位机的晶振是16M,波特率是115200,所以觉得有数据丢失很正常。 mingqiang 发表于 2013-2-22 14:53 static/image/common/back.gif
用time.h中的clock函数定时,超过指定时间就重发?
settimer
killtimer 啊,处理WM_TIMER消息。
收到一帧数据的第一个字节时候就setttimer,当帧数据接收完成时候就killtimer,否则在WM_TIMER消息中killtimer并要求下位机重发数据帧。 timeout 本帖最后由 mingqiang 于 2013-2-25 16:40 编辑
已经解决,用clock函数就可以了。相关的部分程序如下。
if(comstat.cbInQue == 0)//COMSTAT结构返回串口状态信息,cbInQue成员变量的值代表输入缓冲区的字节数
{
if(flagtime==0)
{
flagtime=1; //标志,区别是否连续进入if(comstat.cbInQue == 0)
start=clock();
//printf("a\n");
}
else
{
end=clock();
if((end-start)/CLOCKS_PER_SEC>0.01) //单位是秒,可以精确到毫秒 ,这里定的是超过10ms没收到串口数据就执行如下操作
{
start=clock(); //重置起始时间
WriteChar("b",1);//下发“b”,告诉下位机重发
}
}
continue;
}
flagtime=0; mingqiang 发表于 2013-2-22 14:46
我也是参考的lishaoan的例子,网上一搜一大把。
您参考的例子 在哪可以看到,谢谢 也在做这个。
页:
[1]