使用winAPI串口通信(二)

            采用同步方式的查询方式读取串口数据时,若由于串口操作耗费较长的时间,则程序会被挂起.为解决这种问题,可以在读取数据时采用重叠I/O操作.此时,读写数据的操作在单独的线程中进行,发出读写要求的主线程可以继续运行.当读写数据成功后,读写数据线程可以通过某种方式通知主线程.两个线程协调工作,可以明显提高程序的效率.

         为了实现重叠I/O操作,主要有如下几个编程步骤:  定义全局变量、创建串口、发出读写操作、读写线程函数的建立、关闭串口等.

          1. 定义全局变量

               HANDLE     hCom;          //串口句柄

               DWORD    ThreadProcWrite(LPVOID  pParam);       //写线程函数

               DWORD    ThreadProcRead(LPVOID  pParam);      //读线程函数

               OVERLAPPED     Wol = { 0 };          //写操作OVERLAPPED结构变量

               OVERLAPPED     Rol = { 0 };          //读操作OVERLAPPED结构变量

               HANDLE    hThreadWrite;         //写线程句柄

               HANDLE    hThreadRead;        //读线程句柄

               HWND     hWnd;        //窗口句柄

          2. 创建串口

               hCom = CreateFile ( "COM2",

                             GENERIC_READ | GENERIC_WRITE,

                             0,

                             NULL,

                             OPEN_EXISTING,

                             FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//使用重叠方式

                             NULL );

                      if( hCom != INVALID_HANDLE_VALUE)

                 {

                             SetupComm(hCom,1024,512);

                              DCB   myDCB;

                              GetCommState( hCom,&myDCB);

                              myDCB.BaudRate=CBR_19200;

                              myDCB.fBinary=TRUE;

                              myDCB.fParity=TRUE;

                              myDCB.ByteSize=8;

                              myDCB.Parity=ODDPARITY;

                              myDCB.StopBits=ONESTOPBIT;

                              SetCommState(hCom,&myDCB);

                 }

                else

                {

                         AfxMessageBox("创建串口失败!");

                }

                hWnd = GetSafeHwnd();          //获取当前窗口的句柄

          3. 发出读写操作

               (1) 读操作

                    在读操作中,只是启动读线程.实际的读操作在读线程函数中完成.

                    DWORD    dwThreadID;

                    DWORD    dwParam;

                    hThreadRead = CreateThread ( NULL,

                                                0,

                                                (LPTHREAD_START_ROUTINE)ThreadProcRead,

                                                &dwParam,

                                                0,       //创建线程后,立即执行该线程

                                                &dwThreadID);

                     if(hThreadRead==NULL)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值