一个简单的串行 COM 端口使用类






3.38/5 (5投票s)
本文介绍并解释了serial_interface类的使用方法。这是一种向你的C++代码中添加串口接口的简便方法。
引言
以上下载的serial_interface.zip包含一个头文件和一个源文件(.hpp和.cpp),它们定义了serial_interface
类。编写此类是为了简化在Windows上为原生C++程序实现和使用串口的过程。虽然MSDN库中关于串行连接编程的参考很容易理解,但在某些情况下,可能需要在运行时配置串口。这是一个基本的类,并不支持我想要的所有功能,但它使初始设置更容易,从而节省了软件开发人员的时间。
对于新的COM程序员来说,困难的部分在于Windows要求用户填写一个包含20多个变量的结构体,其中大部分变量会被设置为0、NULL
或FALSE
。使用这个结构体,用户只需要设置五个最常用的变量,这使得设置过程更容易、更快。
背景
我为工作中的一个项目编写了这段代码,因为我需要它。完成后,我意识到其他人也可能需要它,所以我把它公开了。
使用代码
使用这个类非常简单。它不依赖于任何第三方库,所以你只需要将serial_interface.hpp和serial_interface.cpp文件包含到你的项目中,在需要访问串口的文件中#include "serial_interface.hpp"
,获取指向实例和句柄的指针,然后开始运行。
一旦将正确的文件包含到所有正确的位置,使用该类就非常容易。代码如下所示
// set the namespace for the serial interface
using namespace SI;
// get a pointer to the class
serial_interface* serial_port = serial_interface::instance();
然后你可以获取你的配置变量的结构体。这一步是可选的,因为如果你没有指定它们,该类将使用以下默认变量。默认值是
- COM端口:COM1
- 波特率:38400
- 数据位:8
- 停止位:1
- 校验位:无
但是,如果你想更改这些值,调用get_serial_interface
将返回当前的端口设置。请注意,软件将在构造函数中尝试使用这些设置进行自检。获取设置的代码如下所示
// get the current port settings
serial_variables vars = serial_port->get_serial_interface();
SI::serial_variables
结构体包含四个成员:baud
、parity
、bits
和stop_bits
。这些变量都是公开的,可以很容易地更改。建议类的用户使用Windows.h中包含的常量变量来表示这些值,但任何整数都可以工作。例如,要将波特率更改为9600,使用两个停止位并启用奇偶校验,你可以这样写
vars.baud = CBR_9600; // 9600 baud
vars.parity = EVENPARITY; // even parity is enabled (rare)
vars.bits = 4; // 4 bits in a byte (rare)
vars.stop_bits = TWOSTOPBITS // use two stop bits
我应该指出,这些变量的定义在DCB结构的MSDN文档中(这个类试图封装的东西之一)。文章的MSDN链接可以在这里找到:MSDN。
一旦你按照你想要的方式配置了端口(或者决定默认值是可以接受的),你只需调用set_serial_interface
来设置端口,传入你想要使用的COM端口(COM1
、COM2
和COM3
是为方便起见提供的常量)和serial_variables
结构体。
// set up the serial port
serial_port->set_serial_interface(COM1, vars);
就是这样!现在,你可以使用get_serial_handle
获取串口句柄的指针,并开始读取和写入串口。代码如下所示
// get a pointer to the serial port's handle
HANDLE serial_handle = serial_port->get_serial_handle();
就是这样,你可以在五行代码中设置串口。
关注点
目前,该类不支持更改配置的其他因素,例如超时或流控制。原因很简单:如果你必须访问这些额外的变量,那么这个类提供的封装可能对你没有什么帮助,你可以使用标准的Windows COM接口。这个类的目的是允许对串口配置了解较少的用户快速启动和运行COM端口。它假设默认值是可以接受的。
此外,该类使用了单例和p_impl*设计模式,以便软件一次只能操作一个端口,并且如果用户正在使用Visual Studio Intellisense功能,则不会迷失在无法访问的函数中。
该类的另一个特性是,通过调用set_serial_interface
,该类将正确关闭当前端口并使用新设置重新打开,允许用户根据需要动态配置串口。
历史
这是这个类的第一个版本,我欢迎用户提出任何他们想看到的特性或发现的错误。请随时在CodeProject或我的常规博客上联系我。谢谢大家。