windows上,串口读取数据

anChaOs1224 2015-04-26 07:32:31
代码如下

int CMsComm::ReadData(unsigned char *lpBuf, DWORD *dwToRec)
{
int returnValue=0;//返回值

DWORD dwRead;
DWORD dwRes;
//错误标志
COMSTAT ComStat;
//错误
DWORD dwErrorFlags;
BOOL fWaitingOnRead = FALSE;
OVERLAPPED osReader = {0};
//读之前清除缓冲区

//清除错误
ClearCommError(m_hComm,&dwErrorFlags,&ComStat);
//if(ClearCommError(m_hComm,&dwErrorFlags,&ComStat) || dwErrorFlags !=0)
//{
// //清空缓冲区
// PurgeComm(m_hComm, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
// //return -1;
//}

//创建一个事件
osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (osReader.hEvent == NULL)
{
AfxMessageBox(_T("创建事件失败!!!"));
}
//如果并没有阻塞在读上面,那么执行以下代码
if (!fWaitingOnRead)
{
//从串口中读入数据
BOOL bk = ReadFile(m_hComm,lpBuf,*dwToRec,&dwRead,&osReader);

//如果读取不成功
if(!bk)
{
//如果读入不成功是因为阻塞了
if(GetLastError() == ERROR_IO_PENDING)
{
//fWaitingOnRead = TRUE;
dwRes = WaitForSingleObject(osReader.hEvent,INFINITE);
switch (dwRes)
{
case WAIT_OBJECT_0:
{
if (!GetOverlappedResult(m_hComm, &osReader, &dwRead, TRUE))
{
AfxMessageBox(_T("读数据产生错误!!!"));
returnValue = 1;
}
else
{
// AfxMessageBox(_T("读数据成功!!!");
returnValue = 0;
*dwToRec = dwRead;
}
break;
}

//读写超时
case WAIT_TIMEOUT:
{
AfxMessageBox(_T("读超时!!"));
returnValue = 2;
}

break;
default:
{
AfxMessageBox(_T("出现不可预知错误!!!"));
returnValue = 3;
}

break;
}
}
}
}


//返回读入的字节
CloseHandle(osReader.hEvent);

//清空缓冲区
PurgeComm(m_hComm, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

*dwToRec = dwRead;
return returnValue;
}


上面是读取数据的函数内容,我现在遇到了一个问题。
当我需要读取的数据在不大的时候,一切读取正常。
如果读取数据很大,例如,我的实际情况,是读取300k的数据
在调用ReadFile(......)的时候,我只能读取到16k,这是为什么?如何解决这个问题呢?

我在CreateFile()函数的后面,有设置一个

//设置串行口的输入和输出缓冲区的大小
SetupComm(m_hComm,1024,1024);


似乎并没有什么作用
...全文
320 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
anChaOs1224 2015-04-27
  • 打赏
  • 举报
回复
磕磕绊绊,算是搞定了吧?我自己用了一个很土鳖的方法

//从串口中读入数据
BOOL bk = ReadFile(m_hComm,lpBuf,*dwToRec,&dwRead,&osReader);
这里,既然读取数据不完全,那么我用了一个蠢办法 在这句话之后,加个判定

while(读取数据不完全)
ReadFile(......) // 再读取一次
//循环读取,一直到
if(读取数据==我想要的数据)
break;//跳出循环
//继续其他操作...
anChaOs1224 2015-04-27
  • 打赏
  • 举报
回复
引用 1 楼 gd6321374 的回复:
读取数据过大可能会超时,你试试在超时代码后继续读取串口。 这是我写的使用readfile 读串口的代码,你可以参考看看,我现在做项目就用它。 bReadStatus = ReadFile(icdev, RecBuffer, COMBUFFER, &dwByteRead, &m_osRead); if(!bReadStatus) { //GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作 if(GetLastError() == ERROR_IO_PENDING) { //使用WaitForSingleObject函数有阻塞的作用,直到读操作完成或延时已达到 if(WAIT_OBJECT_0 == WaitForSingleObject(m_osRead.hEvent, 6000)) { *RecLen = m_osRead.InternalHigh; //返回接收到的数据长度 PurgeComm(icdev, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); return SRW_OK; } } return Break_ERR; } *RecLen = dwByteRead; //返回接收到的数据长度 PurgeComm(icdev, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR| PURGE_RXCLEAR); //最后用PurgeComm函数清空串口的输入输出缓冲区 return SRW_OK; }
我的后面有这个判断,但是,Readfile返回的并不是0,而是1,所以,很费解,数据读取不完
gd6321374 2015-04-26
  • 打赏
  • 举报
回复
读取数据过大可能会超时,你试试在超时代码后继续读取串口。 这是我写的使用readfile 读串口的代码,你可以参考看看,我现在做项目就用它。 bReadStatus = ReadFile(icdev, RecBuffer, COMBUFFER, &dwByteRead, &m_osRead); if(!bReadStatus) { //GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作 if(GetLastError() == ERROR_IO_PENDING) { //使用WaitForSingleObject函数有阻塞的作用,直到读操作完成或延时已达到 if(WAIT_OBJECT_0 == WaitForSingleObject(m_osRead.hEvent, 6000)) { *RecLen = m_osRead.InternalHigh; //返回接收到的数据长度 PurgeComm(icdev, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); return SRW_OK; } } return Break_ERR; } *RecLen = dwByteRead; //返回接收到的数据长度 PurgeComm(icdev, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR| PURGE_RXCLEAR); //最后用PurgeComm函数清空串口的输入输出缓冲区 return SRW_OK; }

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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