MFC中读取串口时数据总是不全,请问各位大侠有什么方式可以全部读好,谢谢了
答案:2 悬赏:30 手机版
解决时间 2021-02-13 22:26
- 提问者网友:别再叽里呱啦
- 2021-02-13 10:04
我采用的是异步方式事件触发的形式读取串口数据,采用的是readfile函数,ReadFile(hCom, lpInBuffer,dwBytesRead, NULL,&m_osRead); 但是总是读不全就开始处理数据了,读不全的意思是,我原本打算接收到数据是2k(接收的数据不是固定的),但是可能接收到100B就开始处理了,请问有什么方式可以实现全部收到后再处理。还有,我们没有对COMMTIMEOUTS读写超时设置,请问有必要设置么?谢谢各位了
最佳答案
- 五星知识达人网友:人類模型
- 2021-02-13 10:43
你调用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这个缓冲区进行操作。
(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这个缓冲区进行操作。
全部回答
- 1楼网友:大漠
- 2021-02-13 12:01
相关参数设置对了吗?缓冲区的大小啊啊啊啊啊
再看看别人怎么说的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯