同步读写串口设置超时无效

yyh1028 2012-07-02 08:17:40
HANDLE hCom;
//hCom = CreateFile(_T("COM4"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);

if(hCom==INVALID_HANDLE_VALUE)
{
MessageBox(_T("打开串口失败!"));
return;
}

//……配置串口
GetCommState(hCom,&dcb);

//获取外部配置的值
dcb.BaudRate=_tstoi(strBaudRate);
dcb.ByteSize=_tstoi(strDataBit);
dcb.Parity=_tstoi(strParityCheck);
dcb.StopBits=_tstoi(strStopBit);

SetCommState(hCom,&dcb);

SetupComm(hCom, 1024, 1024);//接收缓冲区和发送缓冲区的大小可通过SetupComm函数来设置。
PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
//PurgeComm函数终止所有的后台读写操作并清空接收缓冲区和发送缓冲区:


//设置超时:
COMMTIMEOUTS to;
memset(&to, 0, sizeof(to));
to.ReadIntervalTimeout = 1000;
to.ReadTotalTimeoutMultiplier=500;
to.ReadTotalTimeoutConstant=5000;
to.WriteTotalTimeoutMultiplier=500;
to.WriteTotalTimeoutConstant=2000;

SetCommTimeouts(hCom, &to);

DWORD dwWritenSize = 0;
char strBuffer[20];
memset(strBuffer,0,20);
strBuffer[0]=0x0f;
strBuffer[1]=0x01;
strBuffer[2]=0x01;
strBuffer[3]=0x00;
strBuffer[4]=0x00;
strBuffer[5]=0x00;
strBuffer[6]=0x00;
strBuffer[7]=0x00;
strBuffer[8]=0x00;
strBuffer[9]=0x00;
strBuffer[10]=0x00;
strBuffer[11]=0x00;
strBuffer[12]=0x00;
strBuffer[13]=0x00;
strBuffer[14]=0x00;
strBuffer[15]=0x00;
strBuffer[16]=0x00;
strBuffer[17]=0x00;
strBuffer[18]=0x02;
strBuffer[19]=0xf0;

BOOL bRet = WriteFile(hCom,strBuffer,20,&dwWritenSize,NULL);//一共写入20个字节
if (!bRet)
{
MessageBox(_T("写入串口失败!"));
return;
}

PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
//PurgeComm函数清空串口的输入输出缓冲区

DWORD dwReadSize = 0;
char readBuffer[20];
memset(readBuffer,0,20);
bRet=ReadFile(hCom,readBuffer,20,&dwReadSize,NULL);
if (!bRet)
{
return;
}

//关闭串口
CloseHandle(hCom);
}

问题:即使设置了超时,但在实际读取串口时,程序卡在那里,整个程序无法运行。是不是设置的超时没有起作用?
系统为windows xp,调试环境visual c++ 2008

...全文
324 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxa5201314 2012-12-14
  • 打赏
  • 举报
回复
1. PurgeComm 应该放在WriteFile 前面 2. 你的超时,如果发送端没发送数据,会等15s才会退出,因为用的是同步,界面会卡死。
warlice 2012-07-27
  • 打赏
  • 举报
回复
我也碰到了单步调试卡住的问题。

我现在解决了,我的原因是,由于我设置了要多多少个字节的数据,所以,在没读完之前,不会返回。(超时设置设的是不管超时,因为是同步读取)。所以,你只要让另外的发送端,自动不停的发送数据。单步就不会卡主了。
yyh1028 2012-07-05
  • 打赏
  • 举报
回复
没有人帮帮俺吗?
yyh1028 2012-07-04
  • 打赏
  • 举报
回复
bRet=ReadFile(hCom,readBuffer,20,&dwReadSize,NULL);
单步调试卡在这里
诶呦 2012-07-03
  • 打赏
  • 举报
回复
单步调试卡在哪里?
yyh1028 2012-07-03
  • 打赏
  • 举报
回复
各位高手好心帮忙解决一下吧,难道要设置成异步模式才管用吗?

64,653

社区成员

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

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