VisualBasic串口通信程序设计

2024-08-25

VisualBasic串口通信程序设计(共9篇)

VisualBasic串口通信程序设计 篇1

基于Vxworks实时操作系统的串口通信程序设计与实现

摘要:结合嵌入式实时操作系统VxWorks实现风洞测控系统的实际应用,以其中的串口通信为例,讨论了在VxWorks下实现串口通信的关键技术,给出了基本原理、环境配置和程序示例。

关键词:VxWorks;实时操作系统;嵌入式操作系统;串行通信

[Abstract] Combining with the application of wind tunnel measure and control system with embedded real-time operating system VxWorks , with the serial communication in it as an example ,the key techniques about realization of the serial communication in VxWorks are discussed. Communication mechanism, environment configure and corresponding program examples are provided.

[Key words] VxWorks;RTOS;embedded operating system; Serial Communication

1前言

目前市场上比较著名的实时操作系统有:VxWorks、PSOS、Nucleus、QNX、VRTX、Windows CE、Palm 0S、Lynx0S等。 其中,VxWorks是一个具有微内核、可裁剪的高性能强实时操作系统,在实时操作系统市场上处于领先地位。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、弹道制导、飞机导航等。在美国的 F-16战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至火星探测器上都使用了VxWorks实时操作系统。在嵌入式实时操作系统中使用串口通信,不仅可扩展嵌入式设备通信能力,而且可扩大其应用范围。

2 VxWorks简介

VxWorks是由wRS(wind River Systems,Inc.)公司开发的一套具有微内核、高性能、可伸缩的实时操作系统,支持广泛的网络通信协议,并能够根据用户的需求进行组合,其开放式的结构和对工业标准的支持使开发者只需做最少的工作即可设计出有效的适合于不同用户要求的系统。除了性能出众的操作系统之外,wRS公司还提供了优秀的实时操作系统开发工具Tornado。Tornado由三个高度集成的部分组成:Tornado工具,一整套强有力的交叉开发工具;VxWorks运行系统,是运行在目标机上的高性能、可裁剪的实时操作系统;连接目标机和宿主机的通信选项,加以太网、串行线路、在线仿真等。Tornado能够支持Windows、Unix等流行的工作平台和PowerPC、X86、ARM等几乎所有的目标处理器,所提供的.工具可用于所有目标机,并具有两种调试模式(系统模式和任务模式)。除了基本的功能和开发工具外,Tornado还具有先进的系列网络产品,极大地扩展了Tornado的网络特性,并增强了嵌人式微处理器的网络特性。[1]

3 串口通信基本原理

串口在嵌入式系统当中是一类重要的数据通信接口,其本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位;在接收数据时,串行的位被转换为字节数据。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

串口通信的优点是开发简单,在传输数据量不大、要求速度不高而传输距离较大的通信场合得到广泛应用。

在VxWorks中,将I/O系统设计成为任何类型的设备提供一个简单、统一、独立于设备的接口,任何对于串口的操作都可以视为对一个文件的操作,而不必了解串口设备或程序驱动实现的细节。在串口通信软件的设计中,当串口初始化完成后,在使用之前利用open打开相应串口,然后进行配置。

VxWorks提供终端和伪终端设备驱动。Tty驱动针对实终端;pty针对仿真终端的程序。Tty设备有两种操作模式:raw模式和line模式。在raw模式下,每个刚从设备输入的字符对读者都是有效的;在line模式下所有输入字符被存储,直到NEWLINE字符输入。设备选项字使用带FIOSETOPTIONS 功能的ioctl()程序来设置。[2]

配置完成后,依据串口打开时的读写标志,调用函数write()、read()对串口进行只读操作、只写操作或同时进行读写操作。

为提高数据接收的实时性,可采用中断方式,利用VxWorks提供的select函数的事件触发机制,将读串口的任务阻塞使其一直等待数据,当有数据来到的时候该任务会立刻自动响应,提高系统的实时性。

4环境配置

在本实时应用系统中采用486机作为目标机,串口通信时目标机VxWorks系统启动盘的制作步骤:

(1) 修改通用配置文件Tornadotargetconfigpc486config.h。在config.h文件中加入以下宏定义:

#define INCLUDE_WDB

#define INCLUDE_WDB_TTY_TEST

#undef WDB_COMM_TYPE

#define WDB_COMM_TYPE WDB_COMM_SERIAL /*定义通信方式为串口联结*/

#define WDB_TTY_CHANNEL 1 /*通道号*/

#define WDB_TTY_BAUD 9600 /*串口速率,可设置至38400*/

#define WDB_TTY_DEV_NAME “tyCo/1”

#define CONSOLE_TTY 0

#define DEFAULT_BOOT_LINE “fd=0,0(0,0)hostname:/fd0/vxWorks h=主机

ip e=目标机ip u=主机上的登录用户名”

(2) 在Tornado集成环境中执行菜单命令Project > Make PC486 > Common Targets > clean删除以前生成的文件,执行菜单命令Project > Make PC486 > Boot Rom Targets > bootrom_uncmp编译链接生成bootrom_uncmp ;再选择VxWorks Target,编译生成vxworks;

(3) 拷贝Tornadotargetconfigpc486bootrom_uncmp至Tornadohostbin下

(4) 重命名文件bootrom_uncmp为bootrom;

(5) 准备一张已格式化的空盘插入软驱;

(6) 在目录Tornadohostbin下执行命令 mkboot a: bootrom;

(7)拷贝Tornadotargetconfigpc486VxWorks至软盘;

(8) 将系统制作盘插入目标机软驱,加电启动目标机即载入VxWorkst系统。[3]

5程序示例

5.1 在程序中加入下列头文件

#include

#include “strLib.h”

#include

#include

#include

#include

#include

#include

#include “types/vxTypesOld.h”

5.2 打开串口

int open_com1(void) //打开串口1函数

{ int sfd;//串口设备文件描述符

sfd =open(”/tyCo/0”,0_RDWR,0);//打开串口并返回串口设备文件描述符

if(sfd ==ERROR) //如果不能打开串口1则打印出错信息

printf(“You can’t open port com1 !”);

VisualBasic串口通信程序设计 篇2

1 Visual Basic串口通讯简介

利用VB实现串口通信的方法有2 种, 一种是利用其自身集成的MSComm通讯控件实现与外接设备的通信, 另一种是利用通信API函数实现串口通信。

MSComm通讯控件通过串行端口传输和接收数据, 并为应用程序提供串行通信功能。PC机通过此控件利用串行口与其他设备连接, 从而实现两设备的数据通信。

MSComm通讯控件的主要属性和方法:

Setting:设置并返回通讯参数。

Port Open:通过设置其值打开或关闭串口。

Input:返回并删除接收缓冲区的数据流。

Output:向传输缓冲区写数据流。

根据程序的功能及其用途, 在使用过程中, 用On Comm事件和Comm Event属性监视并检测通信事件和错误值。

Com Ev Send:发送缓冲区的字符数比Sthreshold。

Com Event Rx Parity:其值为1 009, 奇偶位校验。

Com Ev EOF:其值为7, 接收文件中出现的结束符。

2 系统设计

2.1 上位机

该系统使用的上位机采用Visual Basic编程 (图形化编程) , 易于理解。上位机主要用于设置该控制系统开关的初始状态, 同时, 给出Arduino主控单元的控制信号。在控制小车的行进过程中, 小车上集成的传感器将信号传送给上位机, 上位机实时监控小车的运行速度、方向。

2.2 Arduino模块

在该设计中, 将Arduino Uno作为车载核心控制单元。Arduino作为一款便捷、灵活、方便开发的开源平台, 通过外接各种传感器感知环境, 通过电机、灯光和其他装置作出反馈。Arduino Uno主要包括1 个9 V DC输入、1 个USB接口、14个数字IO口、6 个模拟IO口、1 个5 V DV输出和1 个3.3 V DC输出。其核心是1 片ATmega328 芯片。

2.3 电机模块

小车采用双直流电机驱动模式, 2 台电机分别安装在小车后侧, 前轮采用导向轮导向。2 台直流电机利用直流电机驱动芯片LN298 驱动。因为LN298 无法控制电机转速, 所以, 可以通过调节驱动电机的PWM信号脉宽改变电机输出功率, 从而控制电机转速。

2.4 超声波测距模块

该超声波测距模块的有效距离为2~30 cm, 工作电压为3.3~5 V, 是由发射电路和接收电路组成的。在探测距离时, 当经由发射电路发射管发出的管线遇到障碍物时, 反射回来的光线会经过电路处理后输出1 个数字信号给主控单元。此外, 此模块还具有易于调节和控制、使用方便的特性。

3 算法分析

3.1 系统流程分析

在智能小车行进的过程中, 它四周安装的4 个传感器可实时检测小车周围是否有障碍物。当信号经过电路处理后, 通过Arduino控制单元转换, 不断地将数据传送给电脑终端, 在上位机上显示与障碍物的距离, 并利用上位机发送控制信号, 从而实现对小车行进的控制。系统流程如图1 所示。

3.2 避障代码

根据避障原理编写程序, 实现小车的避障功能。该程序主要分为电机、超声波测距2 部分。电机部分由analog Write () 、digital Write () 分别控制车速和小车行进的方向;超声波测距部分由Trig-Pin控制超声波输出, 控制模块通过处理接收到的脉冲时间, 将其转化为距离参数, 从而求得小车与障碍物的实际距离。

4 试验测试

智能小车制作完成后, 要测试小车的避障功能。试验时, 选用一块有多种障碍的平板, 让智能小车在行进过程中判断周围是否有障碍物, 然后将其与障碍物的距离实时传送到上位机, 通过上位机发出的动作指令控制小车的运行方向。

5 结论

基于Visual Basic的串口通讯和Arduino的智能小车控制系统采用上位机与控制单元联合控制的方式, 控制过程体现了交互式设计的优势, 能有效提高智能小车的使用率。

参考文献

[1]李江全.Visual Baisc串口通信及测控应用实例讲解[M].北京:电子工业出版社, 2013.

[2]戴圣伟, 陈白帆, 范绍成.无线遥控智能车的控制研究[J].计算机测量与控制, 2011 (09) .

VisualBasic串口通信程序设计 篇3

关键词:VC++;串口通信;设计方案

To Achieve Design Method of Serial Communication on VC+ +

Xiao Zhihao

(No.715 Institute,Fuyang311400,China)

Abstract: With the computer technology and control technology and the rapid development of increasingly mature,play all kinds of communication between the role of functional modules based on VC + + computer programming serial communications in today's computer software is widely used.In this paper,fully mechanized work system for example,an overview of VC + + based on the host computer and lower computer serial communication between the design method.

Keywords:VC + +;Serial communication;Design

综采工作面电控系统是综合机械化采煤装备,它利用液压支架和采煤机、输送机等多机联动,具有高产、高校、安全、自动化等优点。

一、综述

综采工作面液压支架电控系统硬件如图一所示。下位机的功能是完成液压支架的控制,上位机的功能是完成子控机的监测控制。基于VC++的综采工作面液压直接电控系统实现上位机和下位机之间的串口通信,实现人机界面的动态显示,数据库读写等功能。

图一

二、串行函数接口程序设计

在此系统中,上位机和下位机之间的串口通信可以采用方法很多,例如VB、Matlab、组态王、VC++等等,但是在这几种软件中,VB的编程工具不够完全,效率低;组态王命令语言环境弱,传输大量数据时局限性很大,难以实现复杂的数据处理;Matlab的界面开发能力不强,代码运行效率低。因此,效率高、封装性好、继承性高的VC++软件成为开发本系统的首选串口编程软件。

(一)上位机通信设计。首先要对串口进行初始化,确定其工作方式、波特率等,系统定为:1个停止位、波特率9600,数据格式为8个数据位等。具体实现:

1.设置对话框初始化CAN参数:为对话框建立基于CDialog的派生类CC ansettingDlg,并利用Class-Wizard”菜单项以及Member Variables为参数控件设置关联变量。同时,添加按钮并添加响应函数,点击链接时,各项的初始化参数都自动存储,并且与CAN总线连接,一旦点击启动按钮,就能够存储总线信号。

2.基于VC++采用MFC编写接口函数,过程如下:(1)打开设备并初始化CAN:CCansettingDlg::CCansettingDlg(CWnd* pParent /* = NULL……:CDialog(CCansettingDlg::IDD,pParent);(2)获取CAN 状态:typedef struct _VCI_CAN_STATUS;(3)连接CAN:void CCansettingDlg::OnButtonConnect() / /为连接按钮添加;(4)启动CAN:void CCansettingDlg::OnButtonStartcan();(5)从指定的设备接收数据并放入数据库。

3.创建线程,从CAN总线读取的数据存入数据库:static UINT ReceiveThread( void * param);//创建线程,添加响应函数,设置变量,总线上有数据,就能够触发线程,把数据存入数据库,其函数为:

(二)下位机通信设计。下位机采用的是MCS—51系列中的8051单机。下位机的串行通信设计时采用中断收发数据的,其流程如下图。发送数据时,从累加器中向串口缓冲寄存器中传送数据;接受数据时,从串口缓冲寄存器向累加器传送数据。实际应用中,单片机接受PC机发出的地址信号之后,转入相应的中断程序服务子程序,与PC机通信。

下位机流程图

三、程序串口测试

通过简单串口调试工具,进行程序测试,如下图:

测试显示

如果串口正常运行, 那么可以自由接收和发送数据。

总结:综合上述例子,VC++相对与其他编程软件来说,是一个非常优秀的系统开发平台,编程简化、程序透明化、适应性好、可移植性高。利用VC++运行库的通信函数实现串口通信的原理简单,但是依旧有着不足之处,其实用性和灵活性较差,因此,在具体实践时,要结合软件的功能模块需求,综合考虑其复杂程度、灵活性等环境因素,选择适当的方式,来实现上位机与下位机之间的串口通信。

参考文献:

[1]赵晓辉,陈艳萍,张科英,张东红.基于VC++环境下串口通信程序的研究与实现[J].科技信息,2010,1

[2]王娇,姚竹亭.基于VC++6.0的串口通信的设计[J].测试工具及解决方案,2009,11

[3]白宁,金华晋.基于VC++6.0的串口通信程序开发[J].电脑编程技巧与维护,2010,12

VisualBasic串口通信程序设计 篇4

2011-07-15 11:28:31|分类:|标签: |字号大中小 订阅

1,程序发的数据包太多了,并且数据包的定义是RAM的,很容易造成单片机的RAM不够,因为单片机默认的RAM是128个字节,不过可以扩展高的128个字节,范围在80H-FFH,定义是这样定义的,char idata

XX[]:

如果这样不够的话就只能在想办法来解决这个问题,找一些规律啊,或是改成查表的形式,定义成code 类

型:uchar code XX[]:

2.程序中的要对一些数据进行掉电保存,我这里用到了单片机内部自带的EEROM,在编写程序中也遇到

一些问题,只能保存一个数据,后面:后面调了一下程序:发现一个问题,就是每个对数据进行更新的话,都要对你定义的所以地址的内

容进行,然后在写入,单对某个地址的话就是不行,:

//=======================对保存的四个数据位进行清除扇区

Sector_Erase(add1);

Sector_Erase(add2);

Sector_Erase(add3);

Sector_Erase(add4);

_nop_();_nop_();_nop_();//===小延时一下

//=====================写入要保存的数据位,也是一次要保存好4个数据,不能单一进行了,不然就

会只能保存一个数据

Byte_Program(add1,key_count);

Byte_Program(add2,(char)CLAMP_flag);

Byte_Program(add3,(char)CONV_flag);

Byte_Program(add4,(char)MODE_flag);

3,我这里的PLC用的通信协议是:9600BPSN 7 2

也就是:一个起启位,7个数据位,两个停止位,无校验的形式;

这个我在单片机中用的通信协议是:9600BPSN 8 1

也就是:一个起启位,8个数据位,一个停止位,无校验的形式;

这些两个协议就不对了,哪就要去兼容了,根据数据的原理,我们只在发的数据的最高位是1(也就是一

VisualBasic串口通信程序设计 篇5

串行接口的应用非常广泛, 为实现串口通信功能一般使用专用串行接口芯片, 但是这种接口芯片存在体积较大、接口复杂以及成本较高的缺点, 使得硬件设计更加复杂, 并且结构与功能相对固定, 无法根据设计的需要对其逻辑控制进行灵活的修改。介绍了一种采用FPGA实现串口通信的方法。

1 串口通信协议

对一个设备的处理器来说, 要接收和发送串行通信的数据, 需要一个器件将串行的数据转换为并行的数据以便于处理器进行处理, 这种器件就是UART (Universal Asynchronous Receiver/Transmitter) 通用异步收发器。作为接口的一部分, UART提供以下功能:

1.1 将由计算机内部传送过来的并行数据转换为输出的串行数据流;

1.2 将计算机外部来的串行数据转换为字节, 供计算机内部使用并行数据的器件使用;

1.3 在输出的串行数据流中加入奇偶校验位, 并对从外部接收的数据流进行奇偶校验:

1.4 在输出数据流中加入启停标记, 并从接收数据流中删除启停标记。

2 UART模块设计

UART主要由UART内核、信号检测器、移位寄存器、波特率发生器、计数器、总线选择器和奇偶校验器7个模块组成。 (见图1)

2.1 UART内核模块

UART内核模块是整个设计的核心。在数据接收时, UART内核模块负责控制波特率发生器和移位寄存器同步的接收并且保存RS-232接收端口上的串行数据。在数据发送时, UART内核模块首先产生完整的发送序列, 之后控制移位寄存器将序列加载到移位寄存器的内部寄存器里, 最后再控制波特率发生器驱动移位寄存器将数据串行输出。

2.2 信号检测模块

信号检测器用于对RS-232的输入信号进行实时检测, 一旦发现新的数据则立即通知UART内核。需要注意的是, 这里所说的RS-232输入输出信号都指经过电平转换后的逻辑信号, 而不是RS-232总线上的电平信号。

2.3 移位寄存器模块

移位寄存器的作用是存储输入或者输出的数据。

2.4 波特率发生器模块

由于RS-232传输必定是工作在某种波特率下, 比如9600, 为了便于和RS-232总线进行同步, 需要产生符合RS-232传输波特率的时钟。

2.5 奇偶校验器模块

奇偶校验器的功能是根据奇偶校验的设置和输入数据计算出响应的奇偶校验位, 它是通过纯组合逻辑来实现的。

2.6 总线选择模块

总线选择模块用于选择奇偶校验器的输入是数据发送总线还是数据接收总线。

2.7 计数器模块

计数器模块的功能是记录串行数据发送或者接收的数目, 在计数到某数值时通知UART内核模块。

3 UART程序设计

UART完整的工作流程可以分为接收过程和发送过程两部分。

接收过程是指UART监测到RS-232总线上的数据, 顺序读取串行数据并将其输出给CPU的过程。当信号监测到新的数据 (RS-232输入逻辑变为0, 即RS-232传输协议的起始位) 就会触发接收流程。首先UART内核会重置波特率发生器和移位寄存器, 并且设置移位寄存器的工作模式为波特率模式, 以准备接收数据。其次, 移位寄存器在波特率时钟的驱动下工作, 不断读取RS-232串行总线的输入数据, 并且将数据保存在内部的寄存器内。接收完成后, UART内核会对已接收的数据进行奇偶校验并且输出校验结果。最后, UART内核会重置信号检测器, 以准备进行下一次数据接收。

发送过程是由加载和发送两个步骤组成。加载步骤是UART内核按RS-232串行发送的顺序将起始位、数据位、奇偶校验位和停止位加载到移位寄存器内, 这个过程工作在系统时钟下, 相对于RS-232传输速度来说非常快。完成加载步骤后, UART内核会重置波特率发生器, 并且设置移位寄存器工作在波特率模式下, 于是移位寄存器便在波特率时钟的驱动下依次将加载的数据发送到RS-232的发送端TXD, 这样就产生了RS-232的数据发送时序。

4 FPGA实现

把实验板上电, 下载完成后在PC上打开串口调试助手, 在上方接收区的串口选择COM1, 波特率选择115200, 校验位选择无校验位, 8个数据位1个停止位。每按下reset, 可以在接收区看到FPGA通过串口向PC发送的一个字符串“welcome to wzu”。测试结果验证了程序的准确性。

5 结论

采用FPGA实现串口通信功能将给产品设计研发带来极大方便, 并且可以降低成本, 这种采用可编程逻辑器件代替硬件实现协议功能方案也是未来电子产品开发的发展趋势。

参考文献

[1]韩德红.基于FPGA的串口控制器设计与实现[J].空军雷达学院学报, 2008, 6 (02) :113-116.

[2]蒋璇, 臧春华.数字系统设计与PLD应用[M].北京:电子工业出版社, 2005.

VisualBasic串口通信程序设计 篇6

关键词:串口通信;监控;VB6.0

中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)18-31487-01

VB6.0 Equipment with Serial Communication and Monitoring Capabilities

GU Huan-yu

(Shanghai Telecom Technology Development Ltd.,Shanghai 200065,China)

Abstract:In practical applications,the computer serial port and external serial devices commonly used data transmission channel.This paper introduces the basic principles of serial communication function and presented in windows environment serial communication under the general methods and steps, and Visual Basic 6.0 programming under.

Key words:Serial Communication;Monitor;VB6.0

1 引言

计算机串口是通过串行通讯方式进行通信,即一条信息的各位数据被逐位按顺序传送。串行通讯的特点是:数据位传送按位顺序进行,最少只需一根传输线即可完成,成本低、速度较慢,距离可以从几米到几千米。数据通讯量不是很大时,在工控领域广泛地使用串口通信对设备进行监控。

2 问题描述

为了完成对IP网关相应设备是否正常的监视,包括监视输入线路馈电是否正常,控制前端机完成对使用线路与备用线路之间的切换,随时查询控制状态和监视结果,设计计算机串口通信程序。

通讯指标:通信方式为波特率9600bps的主从半双工串行方式,数据包内字节间最大时隙1.5ms,前端机对主站下行指令的最大响应时间为10ms。

数据包格式为:

(3)校验字为长度字和数据字符段的模256算术和。

3 设计思路

系统主要实现以下功能,即对设备发送读指令,读取设备状态;对设备发送控制指令,控制设备动作。下面以N=0(设备号为0)为例,简单说明程序设计的思想。

(1)系统初始化,系统对N=0的设备发出写控制字命令,所有线路走A路。监测前端机返回状态。

(2)监测线路状态,向前端机发出读状态字命令,分析前端机返回状态,并通过可视界面即时显示。

(3)控制设备:如切换电路等,由系统向设备发出写控制字命令,控制设备动作,通过监测前端机返回状态,判断动作是否成功完成。

4 系统实现

随着Windows的广泛应用,越来越多的微机用户已习惯于Windows操作系统。现在有诸多应用软件都可以帮助我们比较方便实现以上功能,编程工作量相对较小,只需进行主要应用功能的编程和少量界面控制的编程。VB的通讯控件友好、功能强大,编程速度快,加上VB的易学、易用,快速开发等特点,数据通讯量不是很大时,在单片机通讯领域广泛地使用VB开发PC上层通讯软件。下面以VB6.0为例简要说明串口通信的实现。

在VB的控件工具箱中,提供了一个使用非常方便的串行通讯控件MSComm,它全面的提供了使用RS-232串行通讯上层开发的所有细则,它既可以使用查询方式又可以使用事件驱动方式来完成串行通讯。在窗体中加入MSComm控件, 取名为MSComm1, 加入Command命令按钮并取名为initialize. 写入以下代码实现系统初始化:

Private Sub initialize_Click()

If MSComm1.PortOpen = True Then MSComm1.PortOpen = False

MSComm1.InBufferSize = 40 '设置MSComm1接收缓冲区为40字节

MSComm1.CommPort = 1

'设定Com1

If MSComm1.PortOpen = False Then

MSComm1.Settings = "9600,n,8,1"

'9600波特率,无校验,8位数据位,1位停止位

MSComm1.PortOpen = True

'打开串口

End If

MSComm1.OutBufferCount = 0

'清空发送缓冲区

MSComm1.InBufferCount = 0

'清空接收缓冲区

outL(0) = "10"(十进制)

outL(1) = "18"

outL(2) = "208"

outL(3) = "0"

……

outL(19) = "0"

outL(20) = "226"

outL(21) = "13" (outL数组设为Byte 数据类型,存储为单精度型、无符号整型、8 位(1个字节)的数值形式,范围在 0 至 255 之间。)

MSComm1.Output = outL

With MSComm1

.InputMode = comInputModeBinary '设置接收数据模式为二进制形式

'为了实现实时监测功能,接收数据的读取要尽可能的快速,则设置MSComm1的属性如下:

.RThreshold = 1'设置接收一个字节产生OnComm事件

.InputLen = 1 '设置Input 一次从接收缓冲读取字节数为1

.OutBufferCount = 0 '清除发送缓冲区

MaxW = -99 '最大值赋初值

MinW = 99 '最小值赋初值

w = 0 '数据个数计数器清零

If .PortOpen = False Then'判断通信口是否打开

.PortOpen = True '打开通信口

If Err Then'错误处理

MsgBox "串口通信无效"

Exit Sub

End If

End If

End With

End Sub

控件MSComm提供了一个事件OnComm,该事件可以截取串口的任何消息,转入事件处理程序。OnComm可以扑获通讯时发生的串口事件和错误信息,当有串口事件或错误发生时,VB会立刻触发一个OnComm事件,程序就会自动转入OnComm事件处理程序中。MSComm1_OnComm的事件处理程序只处理 comEvReceive事件,首先判断帧数据的开始字节,关闭OnComm接收事件,然后接收数据字节。具体源代码如下:

Dim ab(6) As Byte '字节数据类型数组,用来存储接收到的一组字节数据

Dim av As Variant '用来从接收缓冲区读取数据

Private Sub MSComm1_OnComm()

With MSComm1

Select Case .CommEvent'判断MSComm1通信事件

Case comEvReceive'收到Rthreshold个字节产生的接收事件

av = .Input'读取一个接收字节

ab(1) = av(0)'转换保存到字节数据类型数组

If ab(1) = 10 Then'判断是否为数据开始标志

RThreshold = 0'关闭OnComm事件接收

Do

Loop Until .InBufferCount >= 5

'循环等待MSComm1接收缓冲区>=5个字节

w = w + 1 '计数器累加计数

For i = 2 To 6

av = .Input '读取第二个数据字节(BCD码高位字节)

ab(i) = av(0)'转换保存到字节数据类型数组

Next i

Else

MsgBox "接收数据错误", vbOKOnly, "提示"

Exit Sub

End If

.InBufferCount = 0'清除接收缓冲区

.OutBufferCount = 0 '清除发送缓冲区

End With

End Sub

读状态,响应状态的程序设计也是相似的,但接收到响应状态字需要分析数据。

5 结论

本系统利用VB6.0下的ActiveX控件的串行通信功能,实现了在Windows环境下用单台PC机监控的任务,完成对IP网关相应设备是否正常的监视,监视输入线路馈电是否正常,控制前端机完成对使用线路与备用线路之间的切换,可随时查询控制状态和监视结果。且可结合数据库,纪录通话时间等,模拟交换机功能。整个控制系统灵活方便,具有很大的实用性。

参考文献:

[1]范逸之,陈立元.Visual Basic与RS-232串列通信控制(最新版).清华大学出版社,2002.

[2]Evangelos Petroutsos,Kevin Hough. Visual Basic 6高级开发指南.电子工业出版社,1999.

VisualBasic串口通信程序设计 篇7

1 系统的总体设计

系统的总体设计思想是:PC发送数据, 由MAX232完成RS-232电平到TTL电平的转换, FPGA内部的RXD模块负责转换后串行数据的接收, 数据处理单元对接收数据进行处理, 处理完成以后将数据暂存于FIFO中, TDX读取暂存数据按通信协议把数据发给MAX232反馈给PC, 分析数据是否符合要求, 从而验证整个系统设计的合理性。系统框图如图1所示。

RXD单元每接收完一个数据即向数据处理单元发送一个active高电平有效信号, 告之其此时的数据是需要处理的, 数据处理单元接收到active有效后采集data, 这样可以避免数据采集的错误。不同的系统所要完成的数据处理功能也不相同, 本实验中完成的是对接收信号进行213卷积编码功能。如果其他系统需要采集多个数据后再处理一次, 可以在接收端也添加一个FIFO缓存数据。

2 FPGA主要功能模块设计

2.1 RXD模块

RXD主要包括分频模块, 数据采样存储模块, ASCII码转换模块。为了更好的理解RXD工作流程, 下面先介绍一下异步串行通信的数据传输格式。每发一帧数据包含一位起始位、8位数据位、一位奇偶校验位和一位停止位。当发送端处于空闲状态时, 一直发送高电平。每次开始发送新数据前首先发送一位低电平的起始位, 这样检测端检测到低电平就能判断有效数据已开始发送, 准备接收数据。之后接收8位有效数据, 由低位到高位存储。根据收发方约定, 可以采用无奇偶校验位方式, 发送数据率为9600波特。其发送格式如图2。分频模块:FPGA系统的主时钟为50M, 而采样频率为9600*4hz, 为了提供采样时钟, 可以将主时钟进行1302分频。分频可由计数器完成, 计数器以1302为周期循环计数, 每次计到1302后采样时钟置高, 其它时刻都置低。数据采样存储模块:如果连续2次采样都为低电平, 则判断第3次状态, 也为低电平此时采集的就是起始位。然后记录采样时钟, 4个时钟以后采集下个数据, 这时的判决发生在有效数据的中间, 不会发生误判。将数据存储于8位的移位寄存器当中。存储8位数据以后就完成了一个有效数据的提取, 发送端置高等待下次起始位的到来。

ASCII码转换模块:由于发送端发的是数据的ASCII码, 8位数据代表一个0或者1。30H代表0, 31H代表1, 所以在TXD将数据传送给数据处理单元之前先要完成ASCII码的转换, 将转换后的0、1发给下一单元。RXD的工作流程是接收端一直检测PC的发送数据是否为起始位0, 一旦检测到就进行有效数据位的接收, 因为有效数据为8位, 所以要判断接收的位数, 每结束一个比特计数加一, 当计到8时判定接收完毕, 将接收的数据进行ASCII码转换, 然后传送给数据处理模块进行处理。由于数据处理部分在不同系统中完成的工作各不相同, 本文不再赘述。

2.2 FIFO模块

FIFO (First In First Out) 是一种先进先出的数据缓存器, 即读取数据时优先读取最早存入的数据。本系统调用的ISE自带的FIFO IP核, 保证了速度与功耗的最优, 并节省了开发周期。使用FIFO需要设置一些参数。数据宽度设置为1, 即存储的数据宽度是1位。数据深度是指存储器可以存储数据的个数, 设置要考虑系统要测试的代码长度, 如果要测试1000个发送数据的编码是否正确, 那么编码后产生了2000个数据, 深度可以设置为2048, 留有一定富裕度。读写使能信号由分别由TXD和数据处理单元给出。每次FIFO时钟的上升沿到来时, 如果读写使能为高就进行相应的读写操作。数据处理单元每次处理一个数据后就向FIFO发送一个写使能信号, 告之存储一个数据, TXD的操作类似。

2.3 TXD模块

TXD模块负责把处理后的数据从FIFO中读出, 将其传送给MAX232完成电平转换, 返回给PC分析通过验证处理后的的数据是否符合设计要求来证明收发系统的合理性。TXD给FIFO提供读使能信号rd_en, 当数据处理单元完成一个数的编码后存储器中就存入有效值, 这之后TXD就可以置rd_en为高提取存储器数据。存储器中数据是一位的0或1, 发送给PC接收的数据需要符合异步串行通信的格式。例如发送一个0应先发一位起始位0, 再发送0的ASCII码00001100, 最后发送终止位1。

3 FPGA主要模块的仿真分析

3.1 RXD模块仿真

如图3所示, RXD单元的接收串行信号为rxd, 首先由空闲状态1转变为起始位0.clk为采样时钟, 是接收数据的4倍, 图中可以看到每4个时钟采样一位有效数据, 每个采样点发生在有效数据的中间。rcv_shif是接收8位数据的中间移位寄存器, 每次采样数据时, 移位寄存都移位存储一个数据到最高位。当完成8位数据的接收时, 将其转换为0或1.如图, rxd为31H, 转换后的数据code是1, 同时发送一个active高电平通知数据处理单元进行接收并处理。

3.2 FIFO存储器模块

如图4所示, din是数据的输入端, 依次输入8个不同数据, wr_en为写使能端, 在时钟上升沿前置位, 读时钟一直允许置高, 可以看出dout读数据端按顺序输出写入的数据, 符合FIFO的工作原理。

4 结论

FPGA芯片越来越广泛的应用于电子设计当中, 它与PC的通信完成设计的调试起着重要作用。本文实现了FPGA与PC的串口通信系统, 通过软件仿真和下载测试验证了设计的合理性, 系统可移植性强, 对于其他场合只需改变内部处理单元的功能即可使用。

参考文献

[1]夏宇闻.Verilog数字系统设计教程[M].北京:北京航空航天大学出版社, 2008.

[2]周润景.FPGA/CPLD数字系统设计实例[M].北京:电子工业出版社, 2007.

VisualBasic串口通信程序设计 篇8

串口是常用的计算机与外部串行设备之间的数据传输通道, 由于串行通信方便易行, 所以应用广泛。现在国际上不断有串口新技术及新规格推出, 结合社会各方面需要, 串口通信发展的空间庞大。串口通讯技术因其自身的优势和特性, 及计算机技术的广泛应用深入到生活和生产的各个领域, 世界上数以亿计的通讯设备都以串口通讯的方式在进行着数据的传输。在一个应用系统中, 同时使用Windows和Linux操作系统, 合理地分配资源, 各取所长, 是实现系统高性能的有效途径。为了使两个不同操作系统能协同工作, 实现资源和数据共享, 需要在两者间进行通信。本课题分别研究Linux操作系统与Window操作系统平台下串口通信程序设计。串口通信程序设计的主要模块分别采用VisualC++6.0编程环境与Linux进行开发。本文同时给出了两种编程环境中串口通信程序设计相同点与相异点, 以及它们的比较。

1 开发环境

1.1 硬件环境

能运行Windows 9X/2000/XP和Linux系统的PC机, 配有两个串行口或者是两台配有串行口的PC机, RS232串口连接线。

1.2 软件环境

VisualC++6.0, GCC编程器, Windows9X/2000/XP操作系统和Liunx (RedHat9.2) 操作系统。

1.3 设计原理图

PCI运行Windows系统, PCII运行Linux系统。他们通过RS232串行线连接实现跨平台间的串口通信, 如图1所示。

1.4 流程图

Windows与Linux平台下串口通信程序流程图如图2所示。

2 Windows平台下串口通信程序设计

2.1 打开串口

用CreateFile函数来打开串口句柄, 首先看到, 该类中的串口句柄为HANDLEm hComm;该句柄在应用CreateFile () 函数创建后, 就得到了指定了的串口句柄, 其后, 几乎所有的函数要对串口进行操作时, 必须通过m hComm进行。因为串口句柄在打开时, 设置了异步 (重叠) I/O操作方式, 因此, 必须对串口的超时做出说明, 并在对超时变量进行设置。

2.2 设置串口

在打开通讯设备句柄后, 常常需要对串口进行一些初始化配置工作。这需要通过一个DCB结构来进行。DCB结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息。在查询或配置串口的属性时, 都要用DCB结构来作为缓冲区。

一般用CreateFile打开串口后, 可以调用GetCommState函数来获取串口的初始配置。要修改串口的配置, 应该先修改DCB结构, 然后再调用SetCommState函数设置串口。

2.3 建立线程

在主线程中写数据, 因为写是可以控制的, 而读的时候不知道数据什么时候会到, 所以要建立一个线程专门用来读线程。在这个线程中, 循环地用ReadFile函数读串口, 同时用WaitCommEvent函数检测线路状态。

建立读线程需要用到的函数较多:ReadFile, 如果要检测通信状态, 如CTS信号, RingIn等等, 则用SetCommMask, WaitCommEvent, ClearCommError。

在SerialPor类中, 监测线程函数为CommThread函数。在SerialPort::CommThread () 函数中:首先利用PurgeComm函数清空缓冲区, 调用通信事件监测函数。在监测事件时, 如果异步操作不能立即完成, 则该函数返回FALSE (0) , 并且GetLastError函数返回ERROR IO PENDING, 表明该操作在后台执行。发生这种情况时, 系统在WaitCommEvent函数返回之前将OVERLAPPED结构中的成员hEvent参数值设置为无信号状态, 之后等到特定通信事件或发生错误时, 系统再将其设置为有信号状态。所以只要有字符到达, 就会产生事件。

当监测到是读事件的时候, 就调用ReceiveChar函数去接收数据;当监测到是写事件的时候, 就调用WriteChar函数就发送数据。

调用EnterCriticalSection函数来获得串口的CriticalSection, 保证本进程中没有其他函数或线程使用本串口资源。

用ReadFile函数读出缓冲区中的字节数, ReadFile (HANDLE m hcom, LPVOID RXBuff, DWORD dwlenth, LPDWORD&BytesRead, LPOVERLAPPED m ov) ;参数RXBuff指向接收缓冲区, dwlenth指明要从串口读取的字节数, 在此设置为1, BytesRead指明实际从串口设备中读出的字节数, m ov指向异步I/O结构。

2.4 读写串口

使用ReadFile和WriteFile读写串口, 在用ReadFile和WriteFile读写串口时, 既可以同步执行, 也可以重叠执行。在同步执行时, 函数直到操作完成后才返回。这意味着同步执行时线程会被阻塞, 从而导致效率下降。在重叠执行时, 即使操作还未完成, 这两个函数也会立即返回, 费时的I/O操作在后台进行。ReadFile函数只要在串口输入缓冲区中读入指定数量的字符, 就算完成操作。而WriteFile函数不但要把指定数量的字符拷入到输出缓冲区, 而且要等这些字符从串行口送出去后才算完成操作。

如果操作成功, 这两个函数都返回TRUE。需要注意的是, 当ReadFile和WriteFile返回FALSE时, 不一定就是操作失败, 线程应该调用GetLastError函数分析返回的结果。例如, 在重叠操作时如果操作还未完成函数就返回, 那么函数就返回FALSE, 而且GetLastError函数返回ERROR IO PENDING。

2.5 关闭串口

调用ClosePort () 函数来关闭串口。

3 Linux平台下串口通信程序设计

3.1 打开串口

在Linux下串口文件是位于/dev下, 串口1为/dev/ttyS0, 串口2为/dev/ttyS1, 通过调用open () 打开串口设备, 返回一个整形文件句柄, 以后所有的端口操作都针对这个句柄进行。如果open () 出错, 则返回-1。open () 函数带有2个参数, 其中参数1为要打开的设备文件名, 参数2为打开方式。

3.2 设置串口

进行串口操作之前, 先要对串口通讯的波特率、校验位、输入/输出方式等参数进行设置。Linux下的串口设置实际上是根据POSIX规范来设置的。POSIX规范是由IEEE提出的, 用于定义一系列可移植的操作系统接口。串口设置的所有参数都包含在Termios结构中。Linux提供了两个函数对termios进行操作, 它们是tcgetattr () 和tcsetattr () 。tcgetattr () 函数获得指定串口的设置情况, tcsetattr () 函数用来设置串口的参数。

3.3 读写串口

串口配置完成后, 把串口当作文件来读写。调用write () 函数读写端口, 返回实际读写的字节数, 如果有错误发生则返回-1。

在主线程中写数据, 因为写是可以控制的, write (fd, &WriteData, sizeof (WriteData) ) ;而读的时候不知道数据什么时候会到, 所以要建立一个线程专门用来读数据, 在这个线程中, 循环地用Read读串口。在程序结束时关闭串口close (fd) 。

串口配置完成后, 把串口当作文件来读写。调用read () 函数读写端口, 返回实际读写的字节数, 如果有错误发生则返回-1。

3.4 关闭串口

关闭串口就是关闭文件。使用close () 关闭打开的串口, 唯一的参数是打开串口的文件描述符。

4 Windows和Linux串口通信的异同

4.1 Windows和Linux串口通信的相同点

Windows和Linux启动时均自动检测到标准的串口设备, 而且对串口的打开、关闭、读取和写入所用的函数与操作文件的函数都是相同的。访问串口的几个简单步骤是:

(1) 打开串口设备, 获取Handle;

(2) 设置串口通信参数 (Windows是设置结构体DCB, Linux是设置结构体Termios) , 串口通信初始化设置, 包括数据位、波特率、流量控制等参数;

(3) 准备发送/接收数据;

(4) 数据的发送/接收;

(5) 关闭使用的串口设备。

此外, 在Linux下有许多XWindows开发工具。

4.2 Windows和Linux串口通信的不同点

在Linux下实现串口通信编程和Windows环境不太一样:Linux的串口结合了很多终端特性 (比如在TTY模式下会自动处理某些字符终端控制符) , 与Windows的方式有很大的差异。添加扩展的多口串行通信卡时, Windows则是通过控制面板添加新硬件来完成的, Linux下是通过在系统启动的配置脚本中配置/etc/serial.conf文件完成的。在打开串口时, Windows则需要提供串口的逻辑名, 如COM 1;Linux需要提供的是串口的路径及名称, 且区分大小写, 如/dev/ttyS0。Linux支持NONE, E-VEN, ODD和SPACE四种校验, 而Windows除此之外还支持MASK。在Linux下, 奇偶产生和检测 (PARENB) 及输入奇偶性检验 (INPCK) 是不同的两件事:奇偶位的产生和检测是对输出字符产生奇偶位;输入奇偶性检验则是对输入字符验证其奇偶性。Windows的停止位只有1位、1.5位和2位三种, Linux没有1.5位。Linux支持输入和输出的波特率不同, 可以分开设置。在通过串口传输文件的时候要注意, Linux中的文件行结束符是换行符 (ASCII13) , 而在Windows下是回车换行符 (ASCII10/ASCII13) 。

Windows和Linux串口通信其他的一些不同见表1。

5 结论

本文论述了Windows和Linux两大操作系统中实现串口通信的一般方法, 并且深入研究了串行口通信的原理, 着重阐述了不同操作系统环境中通信的实现技术。本文论述过程中解决了以下问题: (1) Windows平台下串口通信程序设计的步骤, 关键函数的解释, 以及流程图。 (2) Linux平台下串口通信程序设计的步骤, 关键函数的解释。 (3) Windows与Linux平台下串口通信程序设计的异同点。本文所做的研究对于从事Windows和Linux平台下的串口通信程序设计人员有一定的参考价值。

参考文献

[1]常春国, 史金飞, 罗翔, 等.Windows与Linux串口通信和网络通信的比较研究.中国制造业信息化, 2006; (7) :49—65

[2]陈细军, 谭民.VC编程中的串口通信技术.计算机应用, 2001; (9) :

[3]郎俊, 苏小林.Windows下串行通信的探讨.河南职业技术师范学院学报, 2003; (2) :

[4]卢俊岭, 王鹏飞.串口通信Linux和Windows下的实现与比较.榆林学院学报, 2005; (5) :

[5]曹衍龙, 刘海英.Visual C++网络通信编程实用案例精选.北京:人民邮电出版社, 2006

[6]龚志翔, 等.Visual C++编程实例与技巧集粹.兵器工业出版社, 北京希望电子出版社, 2004

[7]魏洪兴, 胡亮, 曲学楼.嵌入式系统设计与事例开发实验教材II——基于ARM9微处理器与Linux操作系统.北京:清华大学出版社, 2005

VisualBasic串口通信程序设计 篇9

关键词:串口通信,协议格式,议分析器,校验和

尽管网络的发展使得越来越多的设备更多地使用网络,而不是使用串口,但细究其开发过程,串口仍不会在近期消失[1]:一则是因为出于开发周期、成本、复杂程度考虑,对于简单的设备不可能全部使用网络接口;再则在大部分硬件开发过程中,本身就使用了串口作为上传和下载程序的手段,在此情况下,串口通信从设计的时候就存在[2]。因此,串口通信仍有大量市场。

由于历史原因及硬件设备的多样性,串口通信参数组合多样、格式各异,没有统一的协议[3],这给调试和开发带来了巨大的困难。为了从众多的协议中找出规律,本文在众多串行通信协议的基础上,分析出一种通用的串口通信格式,进而设计出一套通用的串口通信协议分析器。

1 串口通信分析

串口是一种设备间通用的通信协议,该协议不同于网络通信,该通信方式一般只有点对点的模式[4]。考虑到计算机一般只有两个物理串口,因此,如果计算机需要控制更多的硬件设备,就需要通过PCI多串口卡、USB转多串口设备或更专业的NPort等串口交换机来实现。

1.1 串口协议分析

早期的串口通信RS232标准是EIA与BELL等公司一起开发并于1969年公布的通信协议,随后又出现了RS422、RS485等改进的数据通信接口[5]。在通信之前,通信的双方需要先约定通信所使用的电气参数,然后才能通信。通信的过程中,串口按位(bit)发送和接收字节,由于这种模式速度较慢,所以这种模式较适合于数据传输速率在0~20 000 bit/s范围内的通信。

串行通信接口中有几个重要的概念,分别是波特率(BPS)、数据位(Data)、停止位(Stop)、校验位(Parity)、流量控制位(FlowCtrl)。要想正确对设备进行监控,就必须知道要监控的设备这几个参数的值,否则就无法实现正确地通信[6]。

该通信接口的缺点也是显而易见的:

1)接口拔插不方便,在通电状态下直接拔插容易烧坏接口电路,因此只能在关机状态下才能拔插,且物理特性决定其不能象以太网网线RJ-45接口一样方便。

2)速度慢,以最常见的组合“BPS=38 400, Data=8,Stop=1,Parity=无,流控=无”来算,每秒的数据量是:38 400/[(8+1)×1 024]≈4.2 KB,该数据量很难满意大通讯量的要求。

3)由于数据较慢,因此常常出现数据正在传送的一瞬间进行了读取操作,而导致只读取了数据的前一部分,后一部分需要再读一次。

4)协议虽然很简单,但参数组合较多,对于不知道具体参数的设备,很难确定其最佳参数组合。

5)由于“串行”通讯的特性,无法采用多线程编程。Port口独占,一旦被占用,别的程序就无法再作用。

1.2 几种常见的串口协议格式

下面以不同行业中、主流设备的串口通信协议为例,说明一下常见的几种协议格式[7]:

1)MODBUS协议:MODBUS是应用于控制器的一种通用语言,成为事实的工业标准之一。该协议首字节必须是0x3A,第二字节是设备地址,第三个字节开始是“命令”和“参数N”,参数的有无及个数多少取决于“命令”本身的要求,参数后是CRC校验和,在命令的最后还要加上一个回车符(0x0D)。

2)VDCP协议:VDCP(Video Disk Communication Protocol)是目前视音频行业通用的协议,很多厂家数字视频服务器支持该协议,该协议首字节必须是0x02,第二字节是从“命令”到“参数N”之间的字符个数,第三、第四字节是“命令”,随后是“参数1”到“参数N”,其中所有参数的有无及个数多少取决于“命令”本身的要求,参数后是校验和。很显然该协议长度是变长的,协议字符都不是可见字符。

3)Metiq、CPI类设备协议:该类设备主要用于广电行业的转解码,每一类设备本身又分几十个型号,每个型号都因功能不同而协议不同,但协议格式都是相似的。所有协议首字符都是字符“{”,第二个字节是命令,包含了大小写字母、数字、符号等所有可见字符,第三个字节是参数,参数的有无及个数视命令而定,随后的是尾字符“}”,最后是可见字符校验和。该协议长度同样是变长的,但协议所有字符都是可见的字符。

4)支持终端类操作的设备协议:有很多设备既可通过串口直接收发命令,也能以终端的方式,象Telnet一样远程登录到设备上,输入命令并执行。这种协议以回车结束,所有字符都是可见字符,通常的格式是:“命令+空格+参数+回车”。设备如:ACU卫星天线、SA光端机、

5) 一些特殊的设备协议:还有一些设备协议特殊,如自动增益设备本身不需要发送命令,而设备会自动定时回送所有设备参数;又如某些UPS和空调设备,只需向设备发送一个字节的指定命令,设备就回送所有设备参数。这些形式过于特殊,不在讨论之列。

1.3 协议要素

通过对上述常用串口协议的分析,可以发现串口协议具备如下几个要素[7]:

首尾标识符:为了判断接收到的命令是不是自己的协议,很多协议规定了首标识符或同时规定了首和尾标识符。这样做的最大好处就是当接到命令后,首先判断首尾标识符是否正常,如果不正确,则直接退出语法分析。

地址:有些设备具备串联或级连的特性,为了区分这些设备,会在设备硬件中用一个可修改的开关值作为设备的地址。命令在串口设备所组成的网络中以“广播”的形式发出,设备在接到广播包后,首先判断地址值与自身所设的地址值是否一致,一致的处理,反之退出语法分析。

长度:即使不是变长的协议,很多协议也会加一个长度位来表示全部或某一部分命令的长度,长度字段也可以用来判断设备返回命令是否正确。

命令:这是协议最主要的部分,也是控制设备的关键,有些复杂的设备对命令还会做出分组,如查询类命令、设置类命令、驱动设备动作类的命令。

参数:对于复杂的设备,命令还会跟着一个或多个参数来表示命令的细节处理。对于变长的参数,通常还会在参数前加上“参数长度”位。

校验和:串口通信本身具有易受干扰的特性,如果在命令传送时受到干扰,则可能导致干扰期间的数据出错,为了检查出这种错误,常用校验和进行检错或纠错。

1.4 校验算法

很多串口协议的命令中,有校验和,其算法一般有如下几种[8]:

1)异或(XOR)算法:异或算法是指定位置字符之间的异或操作。

2)求和(SUM)算法:求和算法是指定位置字符之间的求和操作。

3)双算法:该算法是避免求和算法中会出现“正零”和“负零”的问题,具体计算方法是先用求和算法,然后再用256减去所求的和。

4)循环冗余校验码(CRC)算法:该算法以某种规则将要校验的数据转变成某多项式,然后利用多项式除以指定的生成多项式,最后将所除的余数作为校验和。

5)可视字符法:该算法常见于所有内容都为可显示字符的协议中。通常的校验算法是每个字节先减32,然后求和,最后再把和加上32。

需要说明的是,大部分协议的校验和多为一个字节,因此求和很容易导致溢出(即所求的和大于一个字节所能表示的最大数255),一般只需关注未溢出部分即可。

2 本文设计的通用串口通信协议分析器

通过上述分析,可以发现,虽然各硬件设备千差万别,但仍然可以找出其中的规律,通过这些规律即可设计出一个通用的协议分析器。

2.1 语法分析原理图

由图1可见,整个协议最多可以分为8部分,除了“命令”是必须的,其余都视具体协议而定。

1)首字符:

首字符一般由一个或两个字符组成,且内容是固定的。

2)设备地址:

具有联网的功能的设备,通常需要有一个地址位来相互区分,一般用一个字节表示。

3)长度:

长度一般是指协议中某几位可变长度字符的个数。

4)命令:

命令有些是一个字节,有些是两个字节,少数是多个字节,通常在设备协议中会有详细而明确的说明。

5)参数:

参数是协议中最难控制部分,因为参数的有无、多少、格式、是否还带有参数的长度都视具体的协议和具体的命令而定。

6)校验和:

校验和即上述所说的几种算法之一。

7)尾字符:

一般由一个或两个字符组成,且多数与首字符对应。

8)回车:

回车通常有一个(0x0D)或两个字符(0x0D,0x0A)组成。

2.2 相关程序设计

由于程序的流程图与语法图很相似,所以不再赘述。程序的设计只需要按语法分析中的各部分设计即可。

int Append(char *pItem, int nKeyLen, int nPos);//追加项目到发送缓冲区。

上面的函数会将参数指针pItem所指向的内容,按其有效长度nKeyLen,追加到由nPos的开始的命令发送缓冲区中,并返回nPos新的位置。

然后就可以调用该函数生成协议的各个部分。

if (bHaveItem[i]) //如果该设备协议中需要这一部分

nPos=Append((char *)pItem,nKeyLen,nPos);

2.3 脚本生成

有了语法分析图,则可以通过脚本的方式进行配置,通常脚本项需要具有如下几项:

名称、开始位置、长度、存放顺序、调用库函数、相关位(该项与其它相关的位)。

3 实例验证

实验以MODBUS协议为实例来验证本文设计通用串口通信协议分析器。经过所设计的协议分析器对MODBUS进行分析,可得如表1所示的分析结果。

从表1所示的分析结果可知,利用本文设计的串口通信协议分析器,可以有效地发现串口通信协议MODBUS的通用性并对此进行分析。

在实验中,也以其他协议为实例,例如VDCP协议、Metiq、CPI类设备协议等,来验证本文设计的协议分析器,其结果也较好地验证该分析器的可行性和实用性。

4 结束语

虽然同用串口进行通信,但由于设备不同,协议不同,所以每有新设备调试,都需要重新开发针对新协议的测试程序。而本文正是针对这一现象,通过分析各个协议的规律,从共性中找到一个通用的协议格式及设计方法,从而减少了测试的复杂性,提高了工作效率。

参考文献

[1]洪草根,安刚,朱文亮.基于WinCC的多串口通信研究与实现.工业控制计算机,2012;25(2):12—14

[2] Lázaro J I,Astarloa A,Zuloaga A.I2CSec:A secure serial chip-to-chip communication protocol.Journal of Systems Architecture,2012;57(2):206—213

[3]范高其,陈焰,蒋林杰.基于W77E58双串口通信的数据收发系统.贵州大学学报(自然科学版),2011;28(5):59—61

[4]许自敏,朱子焜.基于VB MSComm控件在PC机与单片机串口通信中的应用.工业控制计算机,2011;24(6):104—106

[5] Aziz S M.A cycle-accurate transaction level SystemC model for a ser-ial communication bus.Computers&Electrical Engineering,2009;35(5):790—802

[6]徐嵩,孙秀霞,董文瀚.基于DCOM的无人机地面站串口通信模块设计.计算机工程与设计,2011;32(9):3213—3218

[7]李煊,丁为.常用设备串口通信协议及其应用.自动化仪表,2011;32(10):82—85

上一篇:六年级品德教案下一篇:四年级科学教学计划表