win2k 异步操作串口,需要怎样才比较好,我的代码有点问题

BOYGUARD110 2005-06-08 11:31:05


我先把 问题 说一下:

1. 为什么 代码中的 ::WaitForSingleObject 函数 没有 阻塞 ?

ov.hEvent 应该处于 nonsignaled 状态 才对

////////////////////

完整 代码如下, 省略 容错部分:

大家可以 直接复制过去 然后 试试看

////////////////////////////////
//
//
// 第1步 以异步方式 打开串口 com2
//
HANDLE hFile =::CreateFile("\\\\.\\COM2",
GENERIC_READ | GENERIC_WRITE,
0,NULL,OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,NULL); // 异步 方式 打开

DCB dcb = {0};
::GetCommState(hFile, &dcb);

dcb.BaudRate = 9600 ;
dcb.ByteSize = 8 ;
dcb.Parity = 0 ;
dcb.StopBits = 1 ;
::SetCommState(hFile, &dcb);

::SetupComm(hFile, 1024 , 1024 );

COMMTIMEOUTS timeouts = {100,1,500, 1, 100};
::SetCommTimeouts(hFile, &timeouts);



OVERLAPPED or = {0};
or.hEvent = ::CreateEvent(NULL,FALSE,FALSE,NULL);

BYTE data[100] = {0};
DWORD dwRead;
UINT nRes = ::ReadFile(hFile, data, 50, &dwRead, &or);


if( !nRes )
{
if(::GetLastError() == ERROR_IO_PENDING )
{

DWORD dwRes = ::WaitForSingleObject( or.hEvent,INFINITE);// 这一步 应该 阻塞
// 但是 我实验的结果
// 是 马上返回
// 为什么 ?
if( dwRes == WAIT_OBJECT_0 )
{

TRACE(" dwRes == WAIT_OBJECT_0\n");
}

}
}


::CloseHandle(hFile);
//
////////////////////////////////

请帮忙分析一下原因,谢谢
...全文
98 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
柯本 2005-06-09
  • 打赏
  • 举报
回复
那里就已是我全部的源码
我在实际应用中,没有 m_OverlappedRead .

使用时很简单:

CSerial mySerial;

if (!mySerial.Open(2,9600))
{
MessageBox(_T("无法打开通讯口!"),_T("错误"));
return;
}
unsigned char buff[8*60+2],*p;
int len;
memset(buff,0,60*8);
mySerial.ClearBuff();
mySerial.Send((unsigned char *)"B",1);
mySerial.Revice(buff,8*60,len);
if (len==0)
{
MessageBox(_T("无法读记录"),_T("错误"));
return;
}
我这个通讯类,简单实用(我也是抄来的),我一直用它

至于你的问题,我觉得应该用 WaitCommEvent而不要用WaitForSingleObject



freebird_top 2005-06-09
  • 打赏
  • 举报
回复
WaitForSingleObject

你在这个函数调用后,用GetLastError看一下值是什么.
freebird_top 2005-06-09
  • 打赏
  • 举报
回复
or.hEvent = ::CreateEvent(NULL,FALSE,FALSE,NULL);

应该是手工重置事件.
CreateEvent(NULL,TRUE,FALSE,NULL).

而且最好每次调用读写时用ResetEvent(or.hEvent).即先把事件置为无信号状态,表示操作未完成。
oyljerry 2005-06-09
  • 打赏
  • 举报
回复
注意是否超时
BOYGUARD110 2005-06-09
  • 打赏
  • 举报
回复
keiy() 你好,

你的代码中 有 m_OverlappedRead , 显然是给 ReadFile 用的 ,

能贴一下相关的代码吗? 谢谢

或发送至 buddytom@tom.com
柯本 2005-06-09
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4055/4055364.xml?temp=.677334
qrlvls 2005-06-09
  • 打赏
  • 举报
回复
http://www.codeproject.com/system/cserialport.asp
柯本 2005-06-09
  • 打赏
  • 举报
回复
是啊!SetCommTimeouts的单位是ms,可能是值太小引起的
kuangjingbo 2005-06-09
  • 打赏
  • 举报
回复
表面上看是立即返回,但是我把你的timeouts中的各个数都乘以一个系数(比如1000),你就可以看出来了,并不是立即返回
所以,我想,应该是由于::SetCommTimeouts引起的吧

15,471

社区成员

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

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