MFC中读取串口时数据总是不全,请问各位大侠有什么方式可以全部读好,谢谢了

我采用的是异步方式事件触发的形式读取串口数据,采用的是readfile函数,ReadFile(hCom,lpInBuffer,dwBytesRead,NULL,&m_os... 我采用的是异步方式事件触发的形式读取串口数据,采用的是readfile函数,ReadFile(hCom, lpInBuffer,dwBytesRead, NULL,&m_osRead); 但是总是读不全就开始处理数据了,读不全的意思是,我原本打算接收到数据是2k(接收的数据不是固定的),但是可能接收到100B就开始处理了,请问有什么方式可以实现全部收到后再处理。还有,我们没有对COMMTIMEOUTS读写超时设置,请问有必要设置么?谢谢各位了 展开
 我来答
grf123
推荐于2017-11-27 · TA获得超过538个赞
知道小有建树答主
回答量:455
采纳率:80%
帮助的人:254万
展开全部
你调用ReadFile函数,一次接收多少字节,取决于两个因素:
(1)串口缓冲区实际有多少

(2)你打算取多少

ReadFile()函数的第三个参数表示你打算取多少,但如果你想去1024个,串口缓冲区只有500个,那你最多只能取500个。实际取了多少,会放到ReadFile()这个函数的第四个参数。一般要给这第四个参数传递一个引用。你怎么能填NULL呢?比较简单的办法如下:
DWORD dwReadCount = 0;
do{
ReadFile(hComm, lplnBuffer, dwBytesRead, &dwReadCount, &m_osRead);

if(dwReadCount == 2k)
......这里就可以处理了

else
{
.....// 先把本次读取到的数据存储到你真正能够处理的缓冲区

continue; // 继续读取

}
}

一个关键点是ReadFile()函数中的缓存区,只是为了让这个函数调用从而能够获得数据,具体处理缓冲区最好要自己另外定义,不要图省事直接对lplnBuffer这个缓冲区进行操作。
追问
我缓存用的缓冲区有4k,每秒接收的数据是2k左右,但是每秒接收的数据不是固定的2k,所以不能直接if判断
追答
你大概没有看懂我写的,建议去好好看看ReadFile这个函数的MSDN,或者百度百科也行。

BOOLReadFile(
HANDLEhFile,//文件的句柄
LPVOIDlpBuffer,//用于保存读入数据的一个缓冲区
DWORDnNumberOfBytesToRead,//要读入的字节数
LPDWORDlpNumberOfBytesRead,//指向实际读取字节数的指针
LPOVERLAPPEDlpOverlapped
//如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。
//该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
);

每次收到数据之后,触发事件,开始读取。
static DWORD dwCount = 0;
do
{
DWORD dwReadCount = 0;

ReadFile(dwBytesRead, &dwReadCount...);
dwCount+= dwReadCount;
)while(dwBytesRead >0)

第一次读取假如是512,那就再等,下次串口又来数据了,又触发事件,再读一次,总会增长。
我第一次没写这么清楚,是觉得没有必要。只要明白第四个参数的意义就足够了。建议楼主还是吃透函数的用法,多思考。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pankelili
2014-12-04
知道答主
回答量:15
采纳率:0%
帮助的人:4万
展开全部
相关参数设置对了吗?缓冲区的大小啊啊啊啊啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式