串口问题:关于EV_RXCHAR事件的疑惑 。

tongxilai 2004-03-10 04:57:19
大家好:

1. 我先用WaitCommEvent异步等待EV_RXCHAR事件,然后用WaitForMultiple等待这个事件的发生,当事件发生时我用ClearCommError获取缓冲区中的字符个数,假设该值为 n 。

2. 当串口收到“123”时,我先后收到两次EV_RXCHAR事件,第一次 n 等于 0,
第二次 n 等于 3。

3. 问:为什么会收到第一次的EV_RXCHAR事件?既然收到了事件为什么 n 竟然等于 0 ?奇了怪了!
...全文
418 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sander 2004-04-03
  • 打赏
  • 举报
回复
一般情况是,你一次收了多个,而这个event是1个character 一个event,
这就会造成这个现象。
eYah 2004-04-03
  • 打赏
  • 举报
回复
一般来说是会发生两次呀,用ClearCommError函数,然后用CommStat.cbInQue来获得输入缓冲区的大小,如果是0就略过呀,有就处理,具体:

COMSTAT ComStat ;
if ( mask & EV_RXCHAR)
{
ClearCommError(m_hCom, &dwError, &ComStat );
if (ComStat.cbInQueLength > 0)
{
...........
Sander 2004-04-01
  • 打赏
  • 举报
回复
这可能是正常的。(对方send一个空字符)
eYah 2004-03-31
  • 打赏
  • 举报
回复
并不是waitFormultiple所产生的
呈上头文件部分信息 注释的也很详细的 COPYRIGHT NOTICE Copyright c 2009 华中科技大学tickTick Group (版权声明) All rights reserved @file SerialPort h @brief 串口通信类头文件 本文件完成串口通信类的声明 @version 1 0 @author 卢俊 @E mail:lujun hust@gmail com @date 2010 03 19 修订说明: #ifndef SERIALPORT H #define SERIALPORT H #include <Windows h> 串口通信类 本类实现了对串口的基本操作 例如监听发到指定串口的数据 发送指定数据到串口 class CSerialPort { public: CSerialPort void ; CSerialPort void ; public: 初始化串口函数 @param: UINT portNo 串口编号 默认值为1 即COM1 注意 尽量不要大于9 @param: UINT baud 波特率 默认为9600 @param: char parity 是否进行奇偶校验 "Y"表示需要奇偶校验 "N"表示不需要奇偶校验 @param: UINT databits 数据位的个数 默认值为8个数据位 @param: UINT stopsbits 停止位使用格式 默认值为1 @param: DWORD dwCommEvents 默认为EV RXCHAR 即只要收发任意一个字符 则产生一个事件 @return: bool 初始化是否成功 @note: 在使用其他本类提供的函数前 请先调用本函数进行串口的初始化       n本函数提供了一些常用的串口参数设置 若需要自行设置详细的DCB参数 可使用重载函数 n本串口类析构时会自动关闭串口 无需额外执行关闭串口 @see: bool InitPort UINT portNo 1 UINT baud CBR 9600 char parity "N" UINT databits 8 UINT stopsbits 1 DWORD dwCommEvents EV RXCHAR ; 串口初始化函数 本函数提供直接根据DCB参数设置串口参数 @param: UINT portNo @param: const LPDCB & plDCB @return: bool 初始化是否成功 @note: 本函数提供用户自定义地串口初始化参数 @see: bool InitPort UINT portNo const LPDCB& plDCB ; 开启监听线程 本监听线程完成对串口数据的监听 并将接收到的数据打印到屏幕输出 @return: bool 操作是否成功 @note: 当线程已经处于开启状态时 返回flase @see: bool OpenListenThread ; 关闭监听线程 @return: bool 操作是否成功 @note: 调用本函数后 监听串口的线程将会被关闭 @see: bool CloseListenTread ; 向串口写数据 将缓冲区中的数据写入到串口 @param: unsigned char pData 指向需要写入串口的数据缓冲区 @param: unsigned int length 需要写入的数据长度 @return: bool 操作是否成功 @note: length不要大于pData所指向缓冲区的大小 @see: bool WriteData unsigned char pData unsigned int length ; 获取串口缓冲区中的字节数 @return: UINT 操作是否成功 @note: 当串口缓冲区中无数据时 返回0 @see: UINT GetBytesInCOM ; 读取串口接收缓冲区中一个字节的数据 @param: char & cRecved 存放读取数据的字符变量 @return: bool 读取是否成功 @note: @see: bool ReadChar char &cRecved ; private: 打开串口 @param: UINT portNo 串口设备号 @return: bool 打开是否成功 @note: @see: bool openPort UINT portNo ; 关闭串口 @return: void 操作是否成功 @note: @see: void ClosePort ; 串口监听线程 监听来自串口的数据和信息 @param: void pParam 线程参数 @return: UINT WINAPI 线程返回值 @note: @see: static UINT WINAPI ListenThread void pParam ; private: 串口句柄 HANDLE m hComm; 线程退出标志变量 static bool s bExit; 线程句柄 volatile HANDLE m hListenThread; 同步互斥 临界区保护 CRITICAL SECTION m csCommunicationSync; < 互斥操作串口 }; #endif SERIALPORT H ">呈上头文件部分信息 注释的也很详细的 COPYRIGHT NOTICE Copyright c 2009 华中科技大学tickTick Group (版权声明) All rights reserved @file SerialPort h @brief [更多]

2,640

社区成员

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

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