串口通讯架构设计初探----及其在VS 2010下的实现
串口以其物理线路少、传输距离远、工作稳定可靠而在微机通讯中得以广泛运用。近来由于机缘巧合,有机会得到真实的通过串口通讯控制LED显示屏及感应式读卡控制器的机会,本指望在网上能得到一些有益的指导,但在网上搜索多日,只见到一些串口方面较基础的、偏重编程方面的文章,鲜少有涉及其架构设计的,于是不揣冒昧,把一些真实的实践体会,撰成此文,聊补心中缺憾,诚望同道中人多多指正。
一. 接口设计
1. 串口接口设计
串口,其最基本的作用是通讯,从外观来看,即是读、写字节流,故其接口设计如下:
#pragma once
#include "SerialMessage.h"
class CSerialPort : publicCObject
{
public:
CSerialPort(void);
virtual~CSerialPort(void);
virtualBOOL connect(
const DWORD desiredAccess =GENERIC_READ|GENERIC_WRITE,
const DWORD shareMode = 0,
const DWORD flagsAndAttributes = 0,
const DWORD bandRate = 19200,
const BYTE byteSize = 8,
const BYTE parity = EVENPARITY,
const BYTE stopBits = ONESTOPBIT
)const = 0;
virtualvoid disconnect(void)const = 0;
virtualBOOL PortRead( CSerialMessage *message )const= 0;
virtualBOOL PortWrite( const CSerialMessage *message )const = 0;
};
纯虚函数connect用于创建串口连接,同时设置其工作方式,如同、异步工作方式的选择,以及波特率、数据位数、停止位数及校验方式等;disconnect用于断开串口接连,在程序退出时或更改通讯参数时需要用到;PortRead和PortWrite用于读、写字节流,其参数message兼作读、写缓冲区,其预计读、写长度及实际读、写长度都包含于其中。
2. 通讯协议接口设计
由于RS485只规定了串口的电气特性,至于传输的比特流如何解释、通讯双方如何应答,则未作硬性规定。故实用中连入其中的设备是多种多样的,