向高手请教串口ReadFile()问题!!

pengqiuming 2003-12-18 12:13:30
我的代码很简单,你静下心来看一会就懂了。实现的功能:记时器每隔一秒轮流读串口,有数据可以执行下来,但没有数据时会死机,怎样解决这个问题!!
void CPortSpyExeDlg::OnTimer(UINT nIDEvent)
{
SetCommMask(hComPort, EV_RXCHAR);
if(hComPort != INVALID_HANDLE_VALUE)
{
char *buf=new char[64];
dwCommModemStatus = 0;
::WaitCommEvent(hComPort, &dwCommModemStatus, 0);

if((dwCommModemStatus & EV_RXCHAR)==EV_RXCHAR)
{
DWORD length;
COMSTAT ComStat;
DWORD dwErrorFlags;

ClearCommError(hComPort,&dwErrorFlags,&ComStat);
length = ComStat.cbInQue;
if(length>0)
{
int nj = ReadFile(hComPort,R,length,&length,0); }
}
}

CDialog::OnTimer(nIDEvent);
}
...全文
239 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mazhahn 2003-12-19
  • 打赏
  • 举报
回复
如果是轮询,完全可以把WaitCommEvent()去掉
sxslyy 2003-12-19
  • 打赏
  • 举报
回复
我给你回短信了你看看有没有用.
hanyixin 2003-12-18
  • 打赏
  • 举报
回复

建议不要用阻塞的调用。
ISunwu 2003-12-18
  • 打赏
  • 举报
回复
没有数据就停在::WaitCommEvent(hComPort, &dwCommModemStatus, 0);
这条语句了。不是死机。
建议你使用超时控制更好一些。
Sander 2003-12-18
  • 打赏
  • 举报
回复
用readfile 加 timeout,读的长度尽量大,
如函数返回,check字节数是否与要读的字节数相等,是就再读,不是就是timeout
Sander 2003-12-18
  • 打赏
  • 举报
回复
中间加一个while 循环呀,看看时间到了没有。
pengqiuming 2003-12-18
  • 打赏
  • 举报
回复
其实我程序要实现的功能是:通过记时器来轮流读串口,每次轮流首先检测串口的接受缓冲区在限定的时间内是否有数据到来,如果有就马上读,如果在限定的时间内没有数据来就不读,怎样来限定检测等待的时间??(就是像WaitForSingleObject(对象,超时时间))

(孤松傲雪)虽然可以检测接受缓冲区中数据的多少,但是没有等待
我是做工控的,不能用线程!!
sxslyy 2003-12-18
  • 打赏
  • 举报
回复
::WaitCommEvent(hComPort, &dwCommModemStatus, 0);
这句就是等待,如没有数据,会一直等下.
你可以这样:
void CPortSpyExeDlg::OnTimer(UINT nIDEvent)
{
if(hComPort != INVALID_HANDLE_VALUE)
{
char *buf=new char[64];

DWORD length;
COMSTAT ComStat;
DWORD dwErrorFlags;

ClearCommError(hComPort,&dwErrorFlags,&ComStat);
length = ComStat.cbInQue;
if(length>0)
{
int nj = ReadFile(hComPort,R,length,&length,0); }
}

CDialog::OnTimer(nIDEvent);
}
不过最好将读串口的操作放在另一个线程中.
haichao_ji 2003-12-18
  • 打赏
  • 举报
回复
已经设了定时器了还设中断干什么?

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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