串口API 关于缓冲区满了导致读数据丢失问题

fish861221 2008-06-05 03:55:43
我写了一个异步 ,辅助线程监听读数据的串口程序,可能因为我的数据量很大,在写串口的时候没有及时清除缓冲区,导致数据有丢失,我查了相关资料,看到一个PurgeComm(m_hCom)的函数,能保证发送缓冲区数据都发送成功,然后清除发送缓冲区,但是我读数据那边的缓冲区怎么办啊,我不确定该在什么时候清除??不知道清除已经读过的数据的函数是什么?
我现在用了个傻办法,加大缓冲,但是这样总不好,数据一大就不行了
希望高手能给我说个方法,我晚饭后在线 等~~~~~~~~~~~~~~~~~~~~谢谢了
我分不多 表表心意
...全文
855 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
simon031187 2008-06-05
  • 打赏
  • 举报
回复
现成的代码没有,平时用不上这个
不知道你是怎么样的环境,我还是建议你去查一下SetCommTimeouts这个API,应该能达到你的目的
握手协议做起来麻烦,没必要的情况下能省则省
fish861221 2008-06-05
  • 打赏
  • 举报
回复
希望LSS 继续关注这个帖子啊 我先结了
fish861221 2008-06-05
  • 打赏
  • 举报
回复
我现在用的是读写事件 来控制异步传输,通过手动设置事件不知道能不能实现这种握手协议,你有相关的握手例子程序吗 ?
我今晚试下看看
simon031187 2008-06-05
  • 打赏
  • 举报
回复
最简单实用的做法,就是发送端在两个数据包中间加上一定的延时
接收端一定的时间接收不到新的数据,即判断包已结束,可以收数据清缓冲区

所谓的握手包,就是在数据流里面加同步桢,这样可以判断数据收的是否齐全
对于有些情况,比如温度检测之类的,就可以直接丢弃,读下一段数据
这种方法会增大系统开销,要看具体的应用环境

再要求高一点的话,就需要硬件或者软件流控制,不熟悉的人用不了,你可以上网搜
fish861221 2008-06-05
  • 打赏
  • 举报
回复
请问LS 握手协议的整体应该从哪里把握啊??
知道的朋友也说下 谢谢了
这个问题好关键
fish861221 2008-06-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 simon031187 的回复:]
不要一直不停的发,可以发送一段数据之后,做一下延时
或者给通讯协议加一个握手指令,一个包一个包这样的发
[/Quote]

就是不会这样弄,握手协议没写过,具体如何实现,很茫然.出去吃饭,晚上回来跟你再讨论下
不好意思啊 各位
leelittlelong 2008-06-05
  • 打赏
  • 举报
回复
我总觉得读完之后 缓冲区应该就把这部分数据抛掉了啊。
否则那咋叫读。

fish861221 2008-06-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Joephia 的回复:]

我发现我的写串口代码不断的在执行,就是不断的再发,如何清除已经发送的数据.

引用

这个不是收的问题,而是发的问题,

发送数据应该检查缓冲状态,如果不允许应该等待,而不是不停的发
[/Quote]
这样说是对~,那接收方是一直在读,如何清除已经读了的数据是个问题,不可能用PurgeComm,因为在读的同时,又有新的数据进入缓冲区
fish861221 2008-06-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zsycloud 的回复:]
引用楼主 fish861221 的帖子:
我写了一个异步 ,辅助线程监听读数据的串口程序,可能因为我的数据量很大,在写串口的时候没有及时清除缓冲区,导致数据有丢失,我查了相关资料,看到一个PurgeComm(m_hCom)的函数,能保证发送缓冲区数据都发送成功,然后清除发送缓冲区,但是我读数据那边的缓冲区怎么办啊,我不确定该在什么时候清除??不知道清除已经读过的数据的函数是什么?
我现在用了个傻办法,加大缓冲,但是这样总不好,数据一大…
[/Quote]

如果如您所说设置临界区,那不成了同步了?我现在做异步哦~~~这样的话,全都得改.
我有个想法:发送方一直发等到发送缓冲区数据超过其的一半的时候,暂停发送,接收方还是一直读,读完发送过来的消息的时候,告诉发送方,你可以继续发送了. 这样一直下去,但是不知道具体该怎么实现.........
我觉得好乱
simon031187 2008-06-05
  • 打赏
  • 举报
回复
不要一直不停的发,可以发送一段数据之后,做一下延时
或者给通讯协议加一个握手指令,一个包一个包这样的发
Joephia 2008-06-05
  • 打赏
  • 举报
回复

我发现我的写串口代码不断的在执行,就是不断的再发,如何清除已经发送的数据.

引用
这个不是收的问题,而是发的问题,

发送数据应该检查缓冲状态,如果不允许应该等待,而不是不停的发
zsycloud 2008-06-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 fish861221 的帖子:]
我写了一个异步 ,辅助线程监听读数据的串口程序,可能因为我的数据量很大,在写串口的时候没有及时清除缓冲区,导致数据有丢失,我查了相关资料,看到一个PurgeComm(m_hCom)的函数,能保证发送缓冲区数据都发送成功,然后清除发送缓冲区,但是我读数据那边的缓冲区怎么办啊,我不确定该在什么时候清除??不知道清除已经读过的数据的函数是什么?
我现在用了个傻办法,加大缓冲,但是这样总不好,数据一大就不行了
希望高手能给我…
[/Quote]

你既然已经有了线程监听读数据,那你就应该在线程中,一旦缓冲区就数据就得取出,并清除的呀。当然了,这个缓冲区你得设置成临界区哦。要用PV操作来保证数据的安全哦。呵呵。
fish861221 2008-06-05
  • 打赏
  • 举报
回复
我发现我的写串口代码不断的在执行,就是不断的再发,如何清除已经发送的数据.
因为我的是异步,读和写通讯应该怎么弄?
自己觉得自己很缺乏理论知识,看了很多书,都讲的好简单,没有涉及到这方面的握手协议
!!
谁能给点高见,郁闷中~~~~~~~~~毕业设计---最后一个问题
我想做好点....
scq2099yt 2008-06-05
  • 打赏
  • 举报
回复
用CSerialPort
simon031187 2008-06-05
  • 打赏
  • 举报
回复

PurgeComm(...,PURGE_TXCLEAR|PURGE_RXCLEAR);
WriteFile(...);
ReadFile(...);
fish861221 2008-06-05
  • 打赏
  • 举报
回复
没有涉及到这个知识.那上面都是发字符串的,我是发大量数据,不定时清除已经读过的数据,缓冲区会益出的
zgl7903 2008-06-05
  • 打赏
  • 举报
回复
参考下MSDN中带的多线程串口例程 MTTTY
fish861221 2008-06-05
  • 打赏
  • 举报
回复
char buf[100];
********
ReadComm(buf,100);
/////加在这里不行啊
********


///下面是READ函数实现
DWORD CTerminalDoc::ReadComm(char *buf,DWORD dwLength)
DWORD length=0;
COMSTAT ComStat;
DWORD dwErrorFlags;

ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
length=min(dwLength, ComStat.cbInQue);
ReadFile(m_hCom,buf,length,&length,&m_osRead);
leelittlelong 2008-06-05
  • 打赏
  • 举报
回复
PurgeComm 好像是读写缓存都可以清的吧。
fish861221 2008-06-05
  • 打赏
  • 举报
回复
不行啊 我加在我的READ()后面 数据就丢失了一大半
加载更多回复(2)

16,550

社区成员

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

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

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