VC串口通信中关于PurgeComm函数的疑问。

reneeland 2009-12-07 02:55:11
在每次读写串口之前,要用PurgeComm()函数清空缓冲区。

PurgeComm函数原型:
BOOL PurgeComm(HANDLE hFile, //串口句柄
DWORD dwFlags // 需要完成的操作
);

参数dwFlags指定要完成的操作,可以是下列值的组合:
PURGE_TXABORT 中断所有写操作并立即返回,即使写操作还没有完成。
PURGE_RXABORT 中断所有读操作并立即返回,即使读操作还没有完成。
PURGE_TXCLEAR 清除输出缓冲区
PURGE_RXCLEAR 清除输入缓冲区


我的问题:
1)为什么在读写串口前要先调用这个函数?比如我要读取串口,那么在读取前先调用PurgeComm函数的话,岂不是把串口中要接受的数据给清空了吗?
2)这个函数所说的晴空缓冲区,指的是哪个缓冲区?是我自己在程序中定义的缓冲区?还是指串口硬件里面的缓冲区?
3)如果我在一个线程中,通过While循环不停的从串口中读取数据,每循环读取一次前是不是都要调用PurgeComm函数?这样会不会造成数据的丢失(少接收到一部分串口中的数据)而造成接收的不连续?
...全文
2749 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
一条晚起的虫 2009-12-08
  • 打赏
  • 举报
回复
// PurgeComm不要放到while循环里面
// PurgeComm一般只用在刚打开串口或者串口长时间未使用或者串口出现错误的情况下。
reneeland 2009-12-08
  • 打赏
  • 举报
回复
PurgeComm清理的缓冲区是驱动程序使用的缓冲区,跟m_readbuf没什么关系的话。
那么,PurgeComm函数是不是就不应该放在While循环里面?如果放在While循环里面的话,那岂不每次读取前都会将驱动程序的缓冲区清空掉,这样岂不是会造成读取数据的丢失?
reneeland 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 togoblime 的回复:]
PurgeComm清理的缓冲区是驱动程序使用的缓冲区,跟你的m_readbuf没有关系
[/Quote]

我也是这么觉得~~~
togoblime 2009-12-08
  • 打赏
  • 举报
回复
PurgeComm清理的缓冲区是驱动程序使用的缓冲区,跟你的m_readbuf没有关系
reneeland 2009-12-08
  • 打赏
  • 举报
回复
如果说PurgeComm函数清空的是我程序中定义的缓冲区m_readbuf的话,那没什么意义啊,因为之前我已经用
ZeroMemory函数将m_readbuf清空了啊!

reneeland 2009-12-08
  • 打赏
  • 举报
回复
我的情况是这样的:数据包长度是固定的17个字节,格式也是固定的,以7E开头,以0D结束。这个数据包是在不停的发送,我要从串口中不停的接收这个包。
我在一个线程中通过一个While循环不停的从串口读取这种形式的数据包:只有在第一次读取时,为了找到包头,可能需要舍弃一部分数据,在之后的循环中,读取时要做到不能丢弃任何数据(除非校验不通过)。那么,我的While循环应该如何写?
我之前是这样写的:

while (true)
{
ZeroMemory(gradlg->m_readbuf,256);
PurgeComm(HComm_BMS,PURGE_RXCLEAR);
ClearCommError(HComm_BMS , &dwErrorFlags , &ComStat);

is2 = ReadFile(HComm_BMS, gradlg->m_readbuf, 256, &actualread, 0);

}
听了楼上朋友们的讲解,那我是不是应该把PurgeComm函数放到While循环外面就可以了?
2楼朋友所说的清空串口的缓冲区,具体是指的是什么?是串口硬件里的缓冲区?还是我程序里面定义的m_readbuf?
reneeland 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lfchen 的回复:]
// 在第一次读取之前,为了不受到串口中可能已经存在的数据干扰,所以要PurgeComm
// 在发送之前,为了不发送不需要的数据,所以PurgeComm

// 清空的是你设置的串口缓冲区。

//
[/Quote]
那这个串口缓冲区到底是串口硬件里的缓冲区?还是我程序里定义的串口接收或发送的缓冲区?
lihongling0994 2009-12-08
  • 打赏
  • 举报
回复
While循环里不要使用PurgeComm,应该在While循环前使用,但也有例外,如果对方不停的接收和写数据的话,可以读取或写入之后PurgeComm
===================================================================
不停的清空缓冲在频繁发码工作中是不合适的,这样会丢码,接收串口码的时候最好用数组,在数组中判断起始和结束码,这种方式才不会丢码。
erdgzw 2009-12-07
  • 打赏
  • 举报
回复
1.一般情况是在第一次读取或写入之前使用PurgeComm
2.清空的是COM 缓冲区
3.While循环里不要使用PurgeComm,应该在While循环前使用,但也有例外,如果对方不停的接收和写数据的话,可以读取或写入之后PurgeComm
skynfly 2009-12-07
  • 打赏
  • 举报
回复
学习
一条晚起的虫 2009-12-07
  • 打赏
  • 举报
回复
// 在第一次读取之前,为了不受到串口中可能已经存在的数据干扰,所以要PurgeComm
// 在发送之前,为了不发送不需要的数据,所以PurgeComm

// 清空的是你设置的串口缓冲区。

//

16,466

社区成员

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

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

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