当前位置:首页>> 深入浅出VC++串口编程之基于Win32 API

深入浅出VC++串口编程之基于Win32 API

发布时间:2017-11-19作者:智汇小新

1、API描述

  在WIN32 API中,串口使用文件方式进行访问,其操作的API基本上与文件操作的API一致。

  打开串口

  Win32 中用于打开串口的API 函数为CreateFile,其原型为:

HANDLE CreateFile (
            LPCTSTR lpFileName, //将要打开的串口逻辑名,如COM1 或COM2
            DWORD dwAccess, //指定串口访问的类型,可以是读取、写入或两者并列
            DWORD dwShareMode, //指定共享属性,由于串口不能共享,该参数必须置为0
            LPSECURITY_ATTRIBUTES lpsa, //引用安全性属性结构,缺省值为NULL
            DWORD dwCreate, //创建标志,对串口操作该参数必须置为OPEN EXISTING
            DWORD dwAttrsAndFlags, //属性描述,用于指定该串口是否可进行异步操作,
            //FILE_FLAG_OVERLAPPED:可使用异步的I/O
            HANDLE hTemplateFile //指向模板文件的句柄,对串口而言该参数必须置为NULL
           );


  例如,以下程序用于以同步读写方式打开串口COM1:

HANDLE hCom;
           DWORD dwError;
           hCon = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
           if (hCom == (HANDLE)0xFFFFFFFF)
           {
            dwError = GetLastError();
            MessageBox(dwError);
           }


  对于dwAttrsAndFlags参数及FILE_FLAG_OVERLAPPED标志的由来,可解释如下:Windows文件操作分为同步I/O和重叠I/O(Overlapped I/ O)两种方式,在同步I/O方式中,API会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而在重叠I/O方式中,API会立即返回,操作在后台进行,避免线程的阻塞。重叠I/O非常灵活,它也可以实现阻塞(例如我们可以设置一定要读取到一个数据才能进行到下一步操作)。如果进行I/O操作的API 在没有完成操作的情况下返回,我们可以通过调用GetOverLappedResult()函数阻塞到I/O操作完成后返回。

  配置串口

  配置串口是通过改变设备控制块DCB(Device Control Block) 的成员变量值来实现的,接收缓冲区和发送缓冲区的大小可通过SetupComm函数来设置。

  DCB结构体定义为:

typedef struct _DCB { // dcb
            DWORD DCBlength; // sizeof(DCB)
            DWORD BaudRate; // current baud rate
            DWORD fBinary: 1; // binary mode, no EOF check
            DWORD fParity: 1; // enable parity checking
            DWORD fOutxCtsFlow:1; // CTS output flow control
            DWORD fOutxDsrFlow:1; // DSR output flow control
            DWORD fDtrControl:2; // DTR flow control type
            DWORD fDsrSensitivity:1; // DSR sensitivity
            DWORD fTXContinueOnXoff:1; // XOFF continues Tx
            DWORD fOutX: 1; // XON/XOFF out flow control
            DWORD fInX: 1; // XON/XOFF in flow control
            DWORD fErrorChar: 1; // enable error replacement
            DWORD fNull: 1; // enable null stripping
            DWORD fRtsControl:2; // RTS flow control
            DWORD fAbortOnError:1; // abort reads/writes on error
            DWORD fDummy2:17; // reserved
            WORD wReserved; // not currently used
            WORD XonLim; // transmit XON threshold
            WORD XoffLim; // transmit XOFF threshold
            BYTE ByteSize; // number of bits/byte, 4-8
            BYTE Parity; // 0-4=no,odd,even,mark,space
            BYTE StopBits; // 0,1,2 = 1, 1.5, 2
            char XonChar; // Tx and Rx XON character
            char XoffChar; // Tx and Rx XOFF character
            char ErrorChar; // error replacement character
            char EofChar; // end of input character
            char EvtChar; // received event character
            WORD wReserved1; // reserved; do not use
           } DCB;
           而SetupComm函数的原型则为:
           BOOL SetupComm(
            HANDLE hFile, // handle to communications device
            DWORD dwInQueue, // size of input buffer
            DWORD dwOutQueue // size of output buffer
           );


  以下程序将串口设置为:波特率为9600,数据位数为7位,停止位为2 位,偶校验,接收缓冲区和发送缓冲区大小均为1024个字节,最后用PurgeComm函数终止所有的后台读写操作并清空接收缓冲区和发送缓冲区:

DCB dcb;
           dcb.BaudRate = 9600; //波特率为9600
           dcb.ByteSize = 7; //数据位数为7位
           dcb.Parity = EVENPARITY; //偶校验
           dcb.StopBits = 2; //两个停止位
           dcb.fBinary = TRUE;
           dcb.fParity = TRUE;
           if (!SetCommState(hCom, &dcb))
           {
            MessageBox("串口设置出错!");
           }
           SetupComm(hCom, 1024, 1024);
           PurgeComm(hCom, PURCE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);

       

2.例程

  在《深入浅出Win32多线程程序设计之综合实例》中我们已经给出一个利用WIN API进行串口通信的例子,这里再给出一个类似的例子,以进一步加深理解。

 



  在工程中添加SerialPortControl.h和SerialPortControl.cpp两个文件,前者声明串口控制的接口函数及外部全局变量,后者实现串口接口函数及串口监听线程控制函数。

  SerialPortControl.h文件

 

#ifndef _SERIAL_PORT_CONTROL_H
           #define _SERIAL_PORT_CONTROL_H
           
           #define COM_RECVDATA WM_USER+1000//自定义消息
           
           extern HANDLE hCom; //全局变量,串口句柄
           extern HANDLE hCommThread; //全局变量,串口线程
           //串口监视线程控制函数
           extern DWORD WINAPI SerialPort1ThreadProcess(HWND hWnd);
           //打开并设置PC串口1(COM1)
           extern BOOL OpenSerialPort1();
           
           #endif
           SerialPortControl.cpp文件
           #include "StdAfx.h"
           #include "SerialPortControl.h"
           
           HANDLE hCom; //全局变量,串口句柄
           HANDLE hCommThread; //全局变量,串口线程
           
           BOOL OpenSerialPort1()
           {
            //打开并设置COM1
            hCom=CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0,NULL , OPEN_EXISTING, 0, NULL);
            if (hCom==(HANDLE)-1)
            {
             AfxMessageBox("打开COM1失败");
             return false;
            }
            else
            {
             DCB wdcb;
             GetCommState (hCom, &wdcb);
             wdcb.BaudRate=9600;//波特率:9600,其他:不变
             SetCommState (hCom, &wdcb);
             PurgeComm(hCom, PURGE_TXCLEAR);
            }
            return true;
           }
           
           //以一个线程不同监控串口行接收的数据
           DWORD WINAPI SerialPort1ThreadProcess( HWND hWnd//主窗口句柄)
           {
            char str[101];
            DWORD wCount; //读取的字节数
            while(1)
            {
             ReadFile(hCom,str, 100, &wCount, NULL);
             if(wCount > 0) //收到数据
             {
              str[wCount] = ‘\0‘;
              ::PostMessage(hWnd, COM_RECVDATA, (unsigned int) str, wCount);
              //发送消息给对话框主窗口,以进行接收内容的显示
             }
            }
            return TRUE;
           }



  为了验证程序的正确性,我们使用串口调试助手与本程序协同工作,互相进行收发。


            

公司简介

宜科(天津)电子有限公司是中国工业自动化的领军企业,于2003年在天津投资成立,销售和服务网络覆盖全国。作为中国本土工业自动化产品的提供商和智能制造解决方案的供应商,宜科在汽车、汽车零部件、工程机械、机器人、食品制药、印刷包装、纺织机械、物流设备、电子制造等诸多领域占据领先地位。宜科为智慧工厂的整体规划实施提供自系统层、控制层、网络层到执行层自上而下的全系列服务,产品及解决方案涵盖但不局限于云平台、MES制造执行系统、工业现场总线、工业以太网、工业无线通讯、机器人及智能设备组成的自动化生产线、自动化电气控制系统集成、智能物流仓储系统等,以实现真正智能化的生产制造,从而带来生产力和生产效率的大幅提升,以及对生产灵活性和生产复杂性的管理能力的大幅提升。多年来,宜科以创新的技术、卓越的解决方案和产品坚持不懈地为中国制造业的发展提供全面支持,并以出众的品质和令人信赖的可靠性、领先的技术成就、不懈的创新追求,在业界独树一帜。帮助中国制造业转型升级,加速智能制造进程,成为中国工业4.0智慧工厂解决方案当之无愧的践行者。

更多详情>>

联系我们

  • 联系人:章清涛
  • 热线:18611695135
  • 电话:
  • 传真:
  • 邮箱:18210150532@139.com

Copyright © 2015 ilinki.net Inc. All rights reserved. 智汇工业版权所有

电话:010-62314658 邮箱:service@ilinki.net

主办单位:智汇万联(北京)信息技术有限公司

京ICP备15030148号-1