简单的串行通信






4.09/5 (11投票s)
2003年6月25日
3分钟阅读

197924

9015
一个 C++ 类,用于在 Win32 平台上进行简单的串行通信
引言
这是一个用于处理简单串行通信的 C++ 类的提案,这意味着发送和接收一些字节,并控制串行通信信号的状态。在许多情况下,人们需要能够通过串行端口与某些设备或电子电路进行通信。由于简单性是该类的主要目标,因此它开发用于同步读写操作而不是重叠操作,并且假设没有硬件(或软件)流控制,因此可以自由控制通信信号。如果您需要事件驱动的串行通信(重叠读/写、由事件控制的信号变化等),您可以在此网站上查找一篇名为 Serial communication for Win32 with modem support By thierrydollar 的文章。
使用代码
要使用 CSerialPort 类,您必须调用 CSerialPort::Open,然后进行读写操作,设置或测试通信信号的状态,并在完成后关闭端口(非强制性,因为析构函数会执行此操作)。读写方法不对发送或接收的数据类型和格式做任何假设,您必须考虑您是在处理字符格式还是二进制格式,是否存在 Unicode、mbcs 等。open 函数定义如下:
virtual BOOL Open(LPCTSTR PortName, DWORD BaudRate, BYTE ByteSize,
BYTE Parity, BYTE StopBits, DWORD DesiredAccess = GENERIC_READ|GENERIC_WRITE);
通信参数没有做任何假设,因为它们特定于每次串行通信,并且必须知道才能建立成功的通信。即使最常见的串行端口名称是“COM1:”到“COM4:”,一台机器上也可以有超过 4 个串行端口,并且串行驱动程序不强制遵循“COMxx”名称约定,因此在 Win32 平台上串行端口可以有任何名称。有一个静态函数来获取已安装串行端口的名称会很好,但据我所知,没有文档说明的方法可以做到这一点。有一种简单的方法可以了解已安装的端口:假设端口名称遵循“COMxx:”约定,尝试打开所有可能的端口,如果发生错误并且 GetLastError() 返回 ERROR_FILE_NOT_FOUND,则该端口未安装。还有另一种了解已安装端口名称的方法,即在注册表中搜索,但这不受文档支持且依赖于平台。
本文档附带了一个使用上述类的简单示例,该示例是一个读取串行条形码阅读器条形码的程序。通常,条形码阅读器发送的读取到的条形码以回车符和换行符结尾(这可以配置,甚至可能因特定制造商而异),并且代码是一个 ASCII 字符串。有一个类(CBarCodeReader)派生自 CSerialPort,它封装了描述的协议,其 read 方法直接以字符串形式返回读取到的条形码(如果有)。没有什么更多可说的了,其余的都在代码中,而且很简单(至少应该是 :-))。
备注
请记住,这是一种简单而不是完整的串行设备使用方式。提议的代码可在 Win32 平台和 Windows CE 版本中使用。Pocket PC 开发人员(我没有尝试过其他 Windows CE 版本)必须考虑到制造商可能对串行 API(以及其他 API)有特定的实现。即使事实是这样的实现必须与 Pocket PC 实现兼容,但我发现在不同设备之间存在细微差别。例如:在 Dell Axim Pocket PC 设备上,必须外部提供 CD 信号(存在电压)才能读取或对串行端口进行任何操作,如果您在没有该信号的情况下尝试,不会出现函数错误,但您不会获得任何结果。我在 Compaq iPAQs 上尝试了同样的操作,并且可以在没有任何特定外部信号的情况下进行读取(正如应该的那样)。