Visual C++进行串口通信编程

 

利用Visual C++在windows环境下设计异步串行通信程序可以使用不同的方法。一种方法可以使用windows系统提供的串行口API函数;另一种方法可以直接使用Microsoft公司提供的ActiveX控件MSCOMM.OCX。利用MSCOMM.OCX控件进行串行口程序设计相对比较简单,只要对该控件的属性、事件和方法进行设置和操作,就能完成简单的串行通信功能。而直接使用windows系统提供的串行口API函数则相对较为灵活。试验中,可根据自己的情况任意其中一种进行编程。以下针对如何使用windows系统提供的串行口API函数进行编程做简要介绍
    在
windows系统,串行口和其它通信设备都是作为文件进行处理的。串行口的打开、关闭、发送和接收所用的函数都与操作文件的函数相同。总体来说,利用Visual C++进行异步串行通信程序设计通常可以分为4个大阶段,它们是串行口打开阶段、串行口状态值读取和属性设置阶段、串行数据的发送与接收阶段,以及串行口关闭阶段。

(1)    打开串行口

在对串行口进行所有的操作之前,首先要将其打开。串行口的打开可以使用CreateFile函数,CreateFile函数将返回一个句柄,在随后与该串行口相关的各种操作中使用。与文件操作相同,在利用CreateFile打开串行口时,也可以将串行口指定为“读访问权限”、“写访问权限”或“读写访问权限”。

HANDLE CreateFile

LPCTSTR  lpFileName

DWORD   dwDesiredAccess

DWORD   dwSharedMode

LPSECURITY_ATTRIBUTES  lpSecurityAttributes

DWORD   dwCreationDisposition

DWORD   dwFlagsAndAttributes

HANDLE   hTemplateFile

)

在调用成功时,CreateFile返回打开文件的句柄,该句柄将在以后与该串口相关的各个调用函数中使用。如果调用失败,则CreateFile返回INVALID_HANDLE_VALUE

(2)    串行口的状态读取和属性设置

一旦将串口打开,就可以对该串口的属性进行设置。由于串口的属性非常复杂,因此通常采用读取该串口当前状态值,然后在此基础上进行修改的方法。

n        获取串行口当前状态

windows系统使用GetCommState函数获取串行口的当前配置,GetCommState的声明如下:

BOOL  GetCommState

      HANDLE hFile

      LPDCB  lpDCB

);

GetCommState函数的第一个参数hFile是由CreateFile函数返回指向已打开串行口的句柄。第二个参数指向设备控制块DCBDCB是一个非常重要的数据结构,几乎所有的串行口属性和状态都存储在该结构的成员变量中。

n        对串口进行设置

windows系统利用SetCommState函数修改串行口的当前参数配置。SetCommState函数声明如下:

BOOL  SetCommState

      HANDLE hFile

      LPDCB  lpDCB

);

GetCommState函数的第一个参数hFile是由CreateFile函数返回指向已打开串行口的句柄。第二个参数指向设备控制块DCB。如果函数调用成功,则返回值为非0;若函数调用失败,则返回值为0。当应用程序仅仅需要修改一部分串行口的配置值时,可以通过GetCommState函数获得当前的DCB结构,然后更改参数,再调用SetCommState函数设置修改过的DCB来配置串行口。

n        为串口分配接收和发送缓冲区

当一个串行口打开时,可以为该串口分配一个发送缓冲区和一个接收缓冲区。串行口发送缓冲区和接收缓冲区的配置可以由函数SetupComm实现。如果不调用SetupComm,系统会为该串口分配默认的发送缓冲区和接收缓冲区。但是为了保证缓冲区的大小与实际需要的一致,最好调用该函数进行设置。SetupComm函数原型如下:

BOOL  SetupComm

     HANDLE hFile

     DWORD dwInQueue

     DWORD dwOutQueue

);

其中hFile是由CreateFile函数返回指向已打开串行口的句柄。参数dwInQueuedwOutQueue分别指定应用程序推荐使用的接收缓冲区和发送缓冲区的大小。

n        清空接收和发送缓冲区

在进行串口所有的发送和接收数据操作之前,最好使用PurgeComm函数将串行口发送缓冲区和接收缓冲区中的数据清楚干净。PurgeComm函数原型如下:

BOOL  PurgeComm

     HANDLE  hFile

     DWORD   dwFlages

);

参数hFile是由CreateFile函数返回指向已打开串行口的句柄,参数dwFlags指明执行的动作。如果dwFlagsPURGE_TXCLEAR,则通知系统清空发送缓冲区;如果dwFlagsPURGE_RXCLEAR,则通知系统清空接收缓冲区;如果需要将发送缓冲区和接收缓冲区全部清空,可以把dwFlags设置为PURGE_TXCLEAR|PURGE_RXCLEAR。如果PurgeComm函数调用成功,则返回值为非0;若函数调用失败,则返回值为0

(3)    串行数据的发送和接收

与普通的文件操作相同,在对串行口进行操作时,通常利用ReadFile函数读取串行口收到的数据,利用WriteFile将需要发送的数据写如串行口。

n        串行数据的接收

利用ReadFile函数可以读取将串行口接收到的数据。ReadFile函数原型如下:

BOOL  ReadFile

HANDLE  hFile

LPVIOD   lpBuffer

DWORD   nNumberOfBytesToRead

LPDWORD   lpNumberOfBytesRead

LPOVERLAPPED  lpOverlapped

);

其中参数hFile指向已经打开的串行口句柄;lpBuffer指向一个读取数据缓冲区;nNumberOfBytesToRead指定要从串行设备中读取的字节数;lpNumberOfBytesRead指明实际从串行口中读出的字节数;lpOverlapped指向一个OVERLAPPED结构变量,该结构变量中包含一个同步事件。

通常如果调用成功,ReadFile返回非0值;否则返回值为0。但是对于接收操作在后台进行的串口来说,返回值为0不一定说明函数调用失败。此时可以调用GetLastError函数获取进一步的信息。如果GetLastError返回值为ERROR_IO_PENDING,则说明该读取串口的操作仍然处于后台等待状态,而非一个真正意义上的错误。

n        串行数据的发送

利用WriteFile函数可以向串行口写入数据。WriteFile函数原型如下:

BOOL  WriteFile

HANDLE  hFile

LPVIOD   lpBuffer

DWORD   nNumberOfBytesToWrite

LPDWORD   lpNumberOfBytesWritten

LPOVERLAPPED  lpOverlapped

);

其中参数hFile指向已经打开的串行口句柄;lpBuffer指向一个发送数据缓冲区;nNumberOfBytesToRead指定要从串行设备中发送的字节数;lpNumberOfBytesRead指明实际从串行口中发送的字节数;lpOverlapped指向一个OVERLAPPED结构变量,该结构变量中包含一个同步事件。

通常如果调用成功,WriteFile返回非0值;否则返回值为0。但是对于发送操作在后台进行的串口来说,返回值为0不一定说明函数调用失败。此时可以调用GetLastError函数获取进一步的信息。如果GetLastError返回值为ERROR_IO_PENDING,则说明该写入串口的操作仍然处于后台等待状态,而非一个真正意义上的错误。

(4)    关闭串行口

在用完串行口后通常要将其关闭。如果忘记关闭,该串口会始终处于打开状态,其它的应用程序就不能打开或使用它。

关闭串口可以使用函数CloseHandle,其函数原型如下:

BOOL  CloseHandle

    HANDLE  hObject

);

CloseHandle函数非常简单,其中hObject为该打开串口的句柄。如果该函数调用成功,则返回值为非0;否则返回值为0

书名:《Visual C++串口通信技术详解》(机械工业出版社.李景峰.杨丽娜.潘恒) PDF格式扫描版,全书分为16章,共368页。2010年6月出版。 内容简介 本书介绍如何利用Visual C++集成开发环境进行串口通信程序开发。书中精选来自工程实践的应用范例,主要涵盖串口通信的理论基础、Visual c++集成开发环境简介、MSComm控件串口编程Windows API串口编程、TAPI通信编程串口实现双机互连、串口调试精灵、串口控制Modem设备、串口控制单片机、串口控制PLC、串口控制射频卡、串口控制GPS模块、串口控制云台摄像头、智能报警系统、语音自动应答系统以及USB转RS-232串口实例等。 本书通俗易懂,内容翔实,层次分明,注重知识的系统性、针对性和先进性,注重基础理论与工程实践之间的相互联系。书中实例的源代码均在随书光盘中提供,以方便读者学习和使用。 本书可作为具有一定Visual c++使用基础的读者开发串口通信程序的参考书,也可作为科研单位、高等院校相关专业技术人员的参考书 目录 前言 第一篇 基础理论和基本方法 第1章 串口通信理论基础 1.1 接口技术 1.1.1 接口的定义 1.1.2 接口的基本功能 1.1.3 接口的基本控制方式 1.1.4 并行接口技术 1.1.5 串行接口技术 1.2 RS-232C标准 1.2.1 RS-232C电气特性 1.2.2 RS-232C连接器机械特性 1.2.3 RS-232C的接口信号 1.2.4 RS-232C的通信方式 1.3 RS-422/RS-485标准 1.3.1 RS-422简介 1.3.2 RS-485简介 1.3.3 RS-422/RS-485网络安装注意点 1.4 SPI总线标准 1.4.1 SPI总线原理 1.4.2 SPI总线特点 1.5 USB总线标准 1.5.1 USB总线总体结构 1.5.2 USB数据传输逻辑结构 1.5.3 传输类型 1.6 使用串口通信的典型外设 1.6.1 Modem 1.6.2 传真机 1.6.3 GPS接收机 1.7 实践拓展 第2章 Visual C++集成开发环境简介 2.1 面向对象程序设计与C++语言 2.1.1 面向对象程序设计概述 2.1.2 C++语言基础 2.1.3 C++的面向对象特性 2.2 Visual C++6.0集成开发环境 2.2.1 visual C++6.0开发环境 2.2.2 项目与项目工作区 2.2.3 应用程序向导App Wizard 2.2.4 集成开发基本操作 2.2.5 联机帮助文件 2.3 MFC应用程序的创建 2.4 实践拓展 第3章 MSComm控件串口编程 3.1 MSComm控件简介 3.1.1 MSComm控件描述 3.1.2 MsComm控件常用属性 3.1.3 MSComm控件其他属性 3.1.4 MSComm控件的事件 3.2 MSComm控件编程步骤 3.2.1 加载MSComm控件到项目 3.2.2 初始化并打开串行端口 3.2.3 捕获串行端口事件 3.2.4 串行端口数据读写 3.2.5 关闭串行端口 3.2.6 程序发布问题 3.3 使用MsComm控件实现串口通信接收 3.4 实践拓展 第4章 Windows API串口编程 4.1 windows API串行编程概述 4.1.1 串行编程的数据结构 4.1.2 串行编程的Win32API函数 4.2 win32 API串口通信编程方式 4.2.1 打开串行端口 4.2.2 配置串行端口 4.2.3 读写串行端口 4.2.4 关闭串行端口 4.3 基于win32API函数实现串口通信发送程序 4.4 实践拓展 第5章 TAPI串口编程 5.1 TAPI概述 5.1.1 TAPI的含义 5.1.2 TAPI的体系结构 5.1.3 TAPI的服务类型 5.2 windows TAPI 2.x函数集 5.2.1 Windows TAPI编程流程 5.2.2 TAPI 2.x常用函数 5.3 使用TAPI实现电话拨打程序 5.4 实践拓展 第二篇 串口编程基础应用 第6章 串口实现双机互连 6.1 概述 6.2 通信协议及实现方案 6.2.1 异步串行通信 6.2.2 同步串行通信 6.3 实现代码分析 6.3.1 程序主体设计及关键模块分析 6.3.2 使用API通信 6.4 实践拓展 第7章 串口调试精灵 7.1 串口调试工具实现的基本要求 7.2 串口调试精灵的编程实现 7.2.1 软件功能及流程设计 7.2.2 程序界面分析 7.2.3 编程实现 7.2.4 使用测试 7.3 实践拓展 第8章 串口控制Modem设备 8.1 Modem接口 8.1.1 Modem简介 8.1.2 Modem工作流程 8.1.3 Modem通信方案 8.2 AT指令简介 8.2.1 Modem工作状态 8.2.2 AT指令集 8.3 使用Modem实现远程通信 8.3.1 使用单片机和Modem通信 8.3.2 使用PC和Modem通信 8.4 实践拓展 第9章 串口控制单片机 9.1 串口通信硬件设计 9.1.1 MCS.5 1系列单片机的串口原理 9.1.2 常用的接口芯片介绍 9.1.3 接口电路设计 9.2 串口通信参数设置 9.2.1 波特率设置 9.2.2 奇偶校验位的使用方法 9.2.3 通信协议约定 9.3 系统总体设计 9.4 单片机的串口编程方法 9.5 计算机端通信界面设计 9.6 计算机端程序设计 9.6.1 头文件引用及变量声明 9.6.2 控件加载及控件属性设置 9.6.3 发出读数据请求 9.6.4 接收数据的处理 9.6.5 关闭串口 9.7 实践拓展 第10章 串口控制PLC 10.1 PLC概述 10.1.1 PLC基本结构 10.1.2 PLC串行接口规范 10.1.3 通信协议 10.2 PLC串口通信 10.2.1 计算机与PLC之间的通信流程 10.2.2 PLC通信编程 10.3 实现代码分析 10.3.1 界面设计 10.3.2 程序设计核心代码 10.4 实践拓展 第11章 串口控制射频卡 11.1 射频卡概述 11.1.1 射频卡原理 11.1.2 射频卡分类及应用 11.1.3 典型射频卡模块 11.2 射频卡应用设计 11.2.1 读写器设计 11.2.2 基于射频卡模块的设计 11.3 实现代码分析 11.3.1 界面设计 11.3.2 串口通信程序设计 11.4 实践拓展 第12章 串口控制GPS模块 12.1 GPS系统的基础知识 12.1.1 GPS定位原理 12.1.2 GPS系统 12.2 LEA-4H型GPS模块的性能及其应用 12.3 NMEA-0183协议分析 12.3.1 NMEA-0183协议的定义 12.3.2 NMEA-0183数据信息 12.4 主机与GPS模块串口通信程序实现 12.4.1 MSComm控件属性 12.4.2 添加MSComm控件 12.4.3 添加串口事件消息处理函数OnComm() 12.4.4 数据的接收与提取 12.4.5 实验结果及数据的显示 12.5 实践拓展 第三篇 串口编程高级应用 第13章 串口控制云台摄像头 13.1 云台摄像头 13.1.1 云台简介 13.1.2 摄像头及控制电路 13.2 云台控制协议 13.3 控制程序分析 13.3.1 添加控件 13.3.2 设置界面 13.3.3 主控程序 13.3.4 初始化 13.3.5 配置按钮 13.3.6 通信参数的设置 13.3.7 云台控制命令 13.3.8 旋转控制按钮和镜头控制按钮 13.4 实践拓展 第14章 智能报警系统 14.1 系统描述 14.2 系统分析与设计 14.3 关键技术 14.3.1 建立安防信息数据库 14.3.2 端口设置和定时读取I/O端口数据 14.3.3 判断是否有触发事件 14.3.4 启动并口控制的报警设备 14.3.5 根据设置拨打报警电话 14.3.6 安防日志管理 14.3.7 I/O端口通信 14.4 实现代码分析 14.4.1 创建项目 14.4.2 界面设计与实现 14.4.3 加入数据库支持 14.4.4 关键程序类的实现 14.5 实践拓展 第15章 语音自动应答系统 15.1 功能描述 15.1.1 TAPI介绍 15.1.2 功能介绍 15.1.3 实验要求 15.2 设计流程实现 15.2.1 程序设计流程图 15.2.2 TAPI 3.0方法介绍 15.2.3 串处理分析介绍 15.3 具体功能实现 15.3.1 程序主界面 15.3.2 参数配置 15.3.3 选择语音界面 15.4 实践拓展 第16章 USB转RS-232串口实例 16.1 USB总线技术简介 16.1.1 USB的特点 16.1.2 USB的体系结构 16.1.3 USB的电气特性 16.1.4 USB的数据通信协议 16.2 功能描述 16.3 USB总线转换芯片CH341简介 16.3.1 CH341异步串口工作方式 16.3.2 CH341功能配置 16.4 USB转RS-232桥接器硬件设计 16.5 驱动程序安装 16.6 实践拓展 附录 Modem AT命令集 参考文献
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值