CreateEvent()的参数说明

VC的初学者再学习线程概念的时候往往碰到CreateEvent()函数的使用,对于其中的参数不甚理解,对此做如下说明:

函数原型:

HANDLE CreateEvent(
  LPSECURITY_ATTRIBUTES
lpEventAttributes,
                      // pointer to security attributes
  BOOL bManualReset// flag for manual-reset event
  BOOL bInitialState, // flag for initial state
  LPCTSTR lpName      // pointer to event-object name
);

其中有四个参数,分别注解

LPSECURITY_ATTRIBUTES  pEventAttributes 安区参数  一般用户不用考虑它

BOOL bManualReset    表示SetEvent 置位,WaitForSingleObject使用以此后 信号量的有无,为TRUE 的时候,表示有信号,为FALSE为无信号,也可以理解为SetEvent 的作用是置一次信号,与PulseEvent函数作用相同了。

BOOL bInitialState,    表示初始时的信号量有无,为TRUE 的时,表示有信号,反之无信号

LPCTSTR lpName       信号量的别名

其中主要以BOOL bManualReset  , BOOL bInitialState, 的使用最为重要,采用那种配对方式取决于程序的工作方式了。

在Windows环境下,利用C语言和Win32 API实现异步串口通信,关键在于正确配置串口参数和使用重叠I/O来创建异步读写线程。以下是详细步骤: 参考资源链接:[Windows下C语言实现异步串口通讯详解](https://wenku.youkuaiyun.com/doc/6401abfbcce7214c316ea31f?spm=1055.2569.3001.10343) 首先,使用`CreateFile()`函数打开串口,参数设置为以异步方式打开,即在`dwFlagsAndAttributes`参数中使用`FILE_FLAG_OVERLAPPED`标志。此函数的原型如下: ```c HANDLE CreateFile( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); ``` 创建文件时,`dwDesiredAccess`参数应包含`GENERIC_READ`和`GENERIC_WRITE`以允许读写操作,`dwShareMode`应为0以防止其他进程访问,`dwCreationDisposition`应为`OPEN_EXISTING`以打开已存在的串口。 其次,初始化DCB结构体并使用`SetCommState()`设置串口参数。DCB结构体包含了串口的配置信息,如波特率、数据位、停止位和奇偶校验等。此步骤确保串口按照期望的设置进行通信。 接着,设置串口的超时值,通过`SetCommTimeouts()`函数可以实现。这对于控制读写操作的超时行为非常重要,有助于避免I/O操作无限制地阻塞线程。 然后,调用`SetupComm()`函数设置串口的输入和输出缓冲区大小,确保缓冲区足以处理数据传输。 异步读写的关键在于创建`OVERLAPPED`结构体,并为读写操作创建线程。在创建线程时,需要传递一个`OVERLAPPED`结构体作为参数,该结构体包含一个事件对象,当I/O操作完成时,该事件会被设置为信号状态。 读操作可以通过`ReadFile()`函数实现,写操作可以通过`WriteFile()`函数实现。这两个函数都支持异步操作,因为它们都接受`OVERLAPPED`结构体作为参数。 例如,一个异步读操作的代码片段如下: ```c OVERLAPPED overlapped; memset(&overlapped, 0, sizeof(overlapped)); overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); BOOL result = ReadFile( hSerial, // 串口句柄 buffer, // 数据缓冲区 sizeof(buffer), // 缓冲区大小 NULL, // 实际读取的字节数 &overlapped // OVERLAPPED结构体 ); ``` 读写线程应当使用`WaitForSingleObject()`来等待I/O操作完成,当事件被触发时,调用`GetOverlappedResult()`来检查操作结果。 最后,不要忘记在操作完成后关闭事件句柄和串口句柄,释放资源。 通过上述步骤,你可以在Windows下使用C语言和Win32 API实现异步串口通信。为了更深入理解每个步骤的具体实现和潜在问题,建议查阅《Windows下C语言实现异步串口通讯详解》,这将为你的项目提供详尽的指导和实用的示例代码。 参考资源链接:[Windows下C语言实现异步串口通讯详解](https://wenku.youkuaiyun.com/doc/6401abfbcce7214c316ea31f?spm=1055.2569.3001.10343)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值