使用winAPI 串口通信(一)

串口和其他通信设备是作为文件 处理的.简单的可以采用查询方式(定时方式),复杂些的可以采用事件驱动的方式.   所谓驱动方式,即当有串行数据进入输入缓冲区时,自动执行接受程序.

        使用winAPI来编写 串口通信程序时,读写操作可以有同步方式与重叠的异步方式.    所谓同步方式 ,就是当命令发出后,直到数据确实写入到缓冲区后,写函数才返回.这种方式操作简单,但当数据写入时间较长时,将会使程序挂起,降低程序的效率. 为了解决这种问题,引入异步的重叠操作方式 .在这种操作下,当执行完命令,不管写入操作是否完成,写函数马上返回,写操作在后台继续进行,当写操作完成后,通过某种方式通知调用写操作的线程.这样,就避免了主线程被挂起 ,提高了程序的效率.

       一、采用同步查询方式的编程方法

        1.创建串口

            (1) CreateFile()函数.

                  该函数是一个通用的创建或打开文件的函数.在winAPI编程中,它不仅可以操作文件也可以操作串口.使用该函数可以打开一个串口,并返回一个句柄,在程序中可以通过访问该句柄来实现对串口的访问.

            HANDLE     CreateFile (

                                LPCTSTR      lpFileName,    

                                DWORD      dwDesireAccess,

                                DWORD      dwShareMode,

                                LPSECURITY_ATTRIBUTES      lpSecurityAttributes,

                                DWORD       dwCreationDisposition,

                                DWORD       dwFlagsAndAttributes,

                                HANDLE      hTemplateFile

           );

           (2)SetupComm()函数

               设置串口输入缓冲区及输出缓冲区的大小

               BOOL     SetupComm  (

                              HANDLE      hFile,

                              DWORD      dwInQueue,

                              DWORD      dwOutQueue

               );

           (3) DCB数据结构

               串口通信中,使用该数据结构存放通信参数.

               由于该结构包括的通信参数很多,逐个设置不方便.通常的做法是首先将串口的当前设置读出到一个DCB结构中,然后根据需要修改该DCB结构中的某些参数,再以该结构来设置串口通信参数.

          (4) SetCommState() 函数

              要设置通信参数,首先定义一个DCB结构类型的变量. 根据通信要求,设置该结构变量的数值.然后以该结构变量作为参数,执行该函数即可完成串口通信参数的设置.

              BOOL    SetCommState  (

                            HANDLE     hFile,

                            LPDCB      lpDCB

               );

           (5) GetCommState() 函数

                该函数用来获取当前串口通信参数的设置数值.获取的参数值存放到一个DCB结构类型的变量中.

               BOOL     GetCommState (

                            HANDLE     hFile,

                            LPDCB      lpDCB

               );

             2. 关闭串口

               关闭串口的操作很简单,只需执行CloseHandle()函数即可.

               BOOL    CloseHandle  (

                          HANDLE   hObject

               );

          3. 发送数据

             发送数据使用WriteFile()函数

             BOOL    WriteFile (

                       HANDLE    hFile,

                       LPCVOID     lpBuffer,

                       DWORD     nNumberOfBytesToWrite,

                       LPDWORD     lpNumberOfBytesWriten,

                       LPOVERLAPPED     lpOverlapped

              );

           4. 接收数据

              接收数据使用ReadFile()函数

             BOOL    ReadFile (

                       HANDLE    hFile,

                       LPCVOID     lpBuffer,

                       DWORD     nNumberOfBytesToRead,

                       LPDWORD     lpNumberOfBytesRead,

                       LPOVERLAPPED     lpOverlapped

              );

           5. 定时接收数据的方法

              要实现定时接收数据,需要使用定时器,然后将接收数据的操作放在定时器的响应事件函数中. 主要有以下几步操作:

              (1) 编写定时器响应函数

                    定时器响应函数是全局函数,不属于任何类.直接在cpp文件中书写:

                    VOID  CALLBACK   TimerProc (

                              HWND    hwnd,      //启动定时器的窗口句柄

                              UINT    uMsg,         //消息的名称.应该为WM_TIMER

                              UINT    idEvent,     //定时器标识符.表明该回调函数的定时器编号

                              DWORD     dwTime )    //当前系统时间

                         {

                                   .......          //这里加入接收操作代码

                        }

                        该函数是个回调函数.当设置的定时器时间到达时,由系统自动调用.

               (2) 启动定时器

                     启动定时器使用SetTimer()函数,该函数可以在程序的任何地方加入.

                     UINT   SetTimer (

                                HWND   hwnd,

                               UINT     nIDEvent,

                               UINT    uElapse,

                               TIMERPROC     lpTimerFunc

                      );

               (3) 关闭定时器

                     关闭定时器使用KillerTimer() 函数,任何地方加入.

                    BOOL    KillTimer (

                              HWND     hwnd,

                             UINT    uIDEvent,

                    );

 http://blog.csdn.net/freedom0203/archive/2008/01/19/2053938.aspx

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值