2019独角兽企业重金招聘Python工程师标准>>>

一、首先是利用WaitCommEvent 来等待串口事件的被触发,这些事件是指在该函数被调用前,我们自己设置好的能触发串口线程的有效事件。

主要包括3类事件:

1. 函数SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR )设置的数据接收中断

2.用户中断线程的操作。

3. 用户发送数据所产生的中断。

该函数相当于利用事件来同步,实际函数也是这么设计的。但没有有效中断触发,线程会一直在这里等待。

一旦被触发,程序才能继续往下执行。

二、函数WaitCommEvent执行完成后,他的返回值若为零,说明有错误,这时候用GetLastError来查询错误类型。

三、函数WaitCommEvent执行返回值若为1,则用ClearCommError来清除错误,并查询串口的状态,得到comstat的值。

四、检查ClearCommError所查询的串口状态comstat.cbInQue的值,若不大于0,说明错误。继续等待事件的触发

五、若omstat.cbInQue大于0,说明buffer里面有字符。在使用WaitForMultipleObjects函数确认事件,并执行对应的操作。

六、接收完缓冲区中的数据后,注意清空缓冲区,方便下一次接收

//WaitCommEvent函数为指定的通信资源监听一系列的Event,这些Event可以由 SetcommMask和 GetcommMask函数来设置和查询。

例子:

bResult = WaitCommEvent(port->m_hComm, &Event, &port->m_ov);

if (!bResult)  
        { 
            // If WaitCommEvent() returns FALSE, process the last error to determin
            switch (dwError = GetLastError()) 
            { 
            case ERROR_IO_PENDING:     
                { 
                    break;
                }
            case 87:
                {
                    break;
                }
            default:
                {
                    port->ProcessErrorMessage("WaitCommEvent()");
                    break;
                }
            }
        }
        else
        {
         
            bResult = ClearCommError(port->m_hComm, &dwError, &comstat);

if (comstat.cbInQue == 0)
                continue;
        }    // end if bResult

//m_hEventArray[0] = m_hShutdownEvent;    // highest priority
            //m_hEventArray[1] = m_ov.hEvent;
            //m_hEventArray[2] = m_hWriteEvent;
        Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE);

switch (Event)
        {
        case 0:
            {
                // Shutdown event.  This is event zero so it will be// the higest priority and be serviced first.                
                CloseHandle(port->m_hComm);
                port->m_hComm=NULL;
                port->m_bThreadAlive = FALSE;                
                // Kill this thread.  break is not needed, but makes me feel better.
                AfxEndThread(100);

break;
            }
        case 1:    // read event
            {
                GetCommMask(port->m_hComm, &CommEvent);
                if (CommEvent & EV_RXCHAR)
                    // Receive character event from port.
                    ReceiveChar(port, comstat);
                if (CommEvent & EV_CTS)
                    ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_CTS_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);
                if (CommEvent & EV_BREAK)
                    ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_BREAK_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);
                if (CommEvent & EV_ERR)
                    ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_ERR_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);
                if (CommEvent & EV_RING)
                    ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_RING_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);
                
                if (CommEvent & EV_RXFLAG)
                    ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_RXFLAG_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);
                    
                break;
            }  
        case 2: // write event
            {
                // Write character event from port
                WriteChar(port);
                break;
            }

} // end switch

} // close forever loop

转载于:https://my.oschina.net/laopiao/blog/135042

串口通讯WaitCommEvent 、GetLastError、ClearCommError、...相关推荐

  1. WIN32:API串口通讯实例教程

    WIN32 API串口通讯实例教程   第一节   实现串口通讯的函数及串口编程简介   API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作.常用函数及 ...

  2. windows c++ 串口通讯

    串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式.工业上常用的串行通讯方式是RS232.RS485. 不管是何种通讯方式,接收端和发送端要实现通讯,要注意串口名.波特率.校验 ...

  3. 串口通讯编程一日通1(整合资料) .

    本文以VC++为平台进行串口通信编程 串口通讯在VC++下实现方式有很多,控件自然是最简单话的方式了,但由于控件只支持对话框程序,有些场合又不需要对话框,所以用Windows API实现是比较好的方式 ...

  4. c#调api串口通讯

    c#调api串口通讯 原文:c#调api串口通讯 在调试ICU通信设备的时候,由于串口通信老出现故障,所以就怀疑CF实现的SerialPort类是否有问题,所以最后决定用纯API函数实现串口读写. 先 ...

  5. 基于VB的串口通讯及其软件实现

    1 串口通信的通信机理 PC串行通信是指直接对串行端口的UART(PC机的通用异步收发器,也叫异步通信适配器,是PC机用于异步通信的接口)进行编程实现的通信 一般说来,PC机都有一个或多个串行端口,它 ...

  6. 串口 发送 接收 高位_电工进阶PLC大神,必备PLC串口通讯的基本知识!

    戳上方蓝字"技成电工课堂"快速关注!!! 电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗?1,什么是串口通讯? ...

  7. plc和pc串口通讯接线_让你搞懂PLC串口通讯和通讯接口,这东西估计没几个能说清楚~...

    电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗? 1,什么是串口通讯? 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线 ...

  8. android 串口开发_详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印...

    01 写在前面: 上篇关于如何在内置仅1M的Esp8285做到 OTA 升级的同步到微信公众号,竟然被安信可的某些运维人员看到了,想要转载,我很欣慰,竟然自己的笔记可以被这么大型的公司员工认可! 我是 ...

  9. CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)

    目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...

  10. c++实现sscom串口助手循环发送_串口通讯你真的会了吗?不妨看看这些经验

    点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看编程笔记! 平时使用串口打印出现乱码的绝大部分原因是串口波特率没对.那么我们怎么测量实际的波特率呢?在这之前,顺便一起回顾一下波特率的概念. 什 ...

最新文章

  1. dede问答模块 那个php文件相对重要,DEDE5.7 问答模板的修改技巧
  2. java notify 指定_java的notify/notifyAll:如何notify指定的线程?
  3. HDU5977-Garden of Eden-树分治+FWT
  4. 矩阵的Cholesky分解
  5. MapReduce案例(数据中获取最大值TopN)
  6. lg函数c语言表达式,lgammal - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
  7. matlab模式识别实验二,模式识别实验二
  8. 四川信息职业技术学院2019考纲复习
  9. Windows 8 下使用 ScrollViewer 替代 GridView
  10. 牛顿迭代法的matlab程序,牛顿迭代法matlab程序
  11. BCH码(BCH code)详细分析
  12. python生成随机中文_随机字生成器-Python
  13. Vbox安装虚拟机教程
  14. HTML超链接标签—链接QQ在线聊天
  15. C措辞教程第二章: 数据范例、运算符、表达式(4)
  16. 微信小程序修改数组中的元素_微信小程序——this.setData()动态修改数组中的某一值...
  17. URP——后期处理特效
  18. VoLTE通话相关技术
  19. 微信公众平台调用百度地图
  20. 在线图片格式转换为 psd png

热门文章

  1. em算法详细例子及推导_EM算法入门教程
  2. c++开发软件_Windows下学习C语言有哪些集成开发软件?
  3. 144显示器只有60_3199元34寸144Hz高刷新曲面带鱼屏显示器咋样?用过才知道
  4. go语言中函数与方法重要的区别:
  5. 大连理工大学计算机视觉实验室,首个镜子分割网络问世,大连理工、鹏城实验室、香港城大出品 | ICCV 2019...
  6. 简单的php cms,30个很棒的PHP开源CMS内容管理系统
  7. edger多组差异性分析_edgeR基因表达差异分析
  8. 【Erlang开源项目】HTTP客户端ibrowse
  9. 限制root远程登录
  10. Linux Kickstart无人值守安装