65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.38/5 (5投票s)

2008年10月13日

CPOL

4分钟阅读

viewsIcon

39618

downloadIcon

1876

本文介绍并解释了serial_interface类的使用方法。这是一种向你的C++代码中添加串口接口的简便方法。

引言

以上下载的serial_interface.zip包含一个头文件和一个源文件(.hpp.cpp),它们定义了serial_interface类。编写此类是为了简化在Windows上为原生C++程序实现和使用串口的过程。虽然MSDN库中关于串行连接编程的参考很容易理解,但在某些情况下,可能需要在运行时配置串口。这是一个基本的类,并不支持我想要的所有功能,但它使初始设置更容易,从而节省了软件开发人员的时间。

对于新的COM程序员来说,困难的部分在于Windows要求用户填写一个包含20多个变量的结构体,其中大部分变量会被设置为0、NULLFALSE。使用这个结构体,用户只需要设置五个最常用的变量,这使得设置过程更容易、更快。

背景

我为工作中的一个项目编写了这段代码,因为我需要它。完成后,我意识到其他人也可能需要它,所以我把它公开了。

使用代码

使用这个类非常简单。它不依赖于任何第三方库,所以你只需要将serial_interface.hppserial_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结构体包含四个成员:baudparitybitsstop_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端口(COM1COM2COM3是为方便起见提供的常量)和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或我的常规博客上联系我。谢谢大家。

© . All rights reserved.