VxWorks下串口通信程序设计与实例

时间:2022-05-22 11:26:37

VxWorks下串口通信程序设计与实例

【摘要】本问讨论了在嵌入式实时操作系统VxWorks下结合PowerPC平台实现串口通信的相关技术,给出了基本原理和程序示例。详细介绍了串口设置时每个参数的配置方法及作用。

【关键词】VxWorks;PowerPC平台;串行通信;串口参数

1.前言

VxWorks是一个具有微内核、可裁剪的高性能强实时操作系统,在全球和国内被大量使用。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中。PowerPC处理器有非常强的嵌入式表现,因为它具有优异的性能、较低的能量损耗以及较低的散热量,包含串行和以太网控制器这样功能强大的集成I/O。在计算机系统通信应用中,RS232串口是目前广泛使用的设备通信控制接口,在嵌入式实时操作系统中实现串口通信,可大大提高系统的应用范围,提高系统获取信息的能力。

2.串口通信原理及优点

串口通信本质是CPU发出的命令数据经串行端口后转换为串行的位,接收方又把串行的位转换成字节命令回送CPU,实现通讯。串口通信有如下优点:

(1)开发简单,用户可以自定义数据格式,独占串口与另一方通讯。

(2)成本低廉,串口通信从转换芯片到传输介质相对其他通信成本廉价。

(3)使用灵活,有全双工RS232,亦有但双工RS485,而且转换方便。

在传输数据量不大,传输距离不大,比如一个变电站内,非常适合使用串口通信。

3.串口通信在Vxworks实现原理

在VxWorks中,将I/O系统设计成为任何类型的设备提供一个简单、统一、独立于设备的接口,任何对于串口的操作都可以视为对一个文件的操作,而不必了解串口设备或程序驱动实现的细节。下面以MPC8309 CPU添加12个串口为例解释实现过程:

(1)软件添加,修改对应BSP包,使系统支持12个串口,并且申请资源。编译BSP包,生成vxworks系统文件及bootrom文件。系统启动时用devs命令可以查看到串口。

(2)硬件支持,使CPU连接串口芯片。实际应用上串口应该是可灵活插拔的。系统支持12个,但具体数目及串口位置按实际连接串口数为准。节约成本。

(3)以上完成后就可用open()函数打开串口进行配置,用read(),write()函数进行读写操作。

(4)为提高数据接收的实时性,可采用中断方式,利用VxWorks提供的select函数的事件触发机制,当有数据来到的时候该任务会立刻自动响应。节省对CPU的占用,提高系统的实时性。

4.程序示例

以下程序对每个参数有详细的说明,以便学习交流。

#include <vxWorks.h>

#include "strLib.h"

#include <string.h>

#include <sioLib.h>

#include <ioLib.h>

#include <stdio.h>

#include <ioctl.h>

#include <selectLib.h> //用于支持select查询等待函数

4.1 初始化串口配置函数

int comInit(void) //初始化串口1

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

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

//打开的不是”/tyCo/0”,因为一般应用平台会用”/tyCo/0”做调试串口,由系统配置使用

if(sfd ==ERROR) //如果不能打开,打印出错信息

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

ioctl(sfd,FIOSETOPTIONS, OPT_RAW); //设置串口工作模式为位模式:OPT_RAW

/*FIOSETOPTIONS对应的arg有OPT_LINE、OPT_RAW、OPT_ECHO等等,在通信中一定要用OPT_RAW模式,其他模式可能导致短数据包收不到。关于这些的定义,可以在sioLib.h,ioLib.h里寻找。*/

ioctl(sfd,FIOBAUDRATE,115200); //设置串口波特率为115200bps

ioctl(fd,FIOFLUSH,0); //清空输入输出缓冲

ioctl(sfd,SIO_HW_OPTS_SET, CLOCAL| CREAD|CS8|STOPB|PARENB|PARODD);

//设置为没有流控制CLOCAL,使能读CREAD,8位数据位,2位停止位,带校验位,奇校验

/* STOPB:两位停止位,默认是1位停止位。PARENB使能校验,PARODD奇校验,使能后默认是偶校验,未使能则是无校验,CS5,CS6,CS7,CS8:5,6,7,8位数据位。

如:CS8|PARENB :8位数据位,1位停止位,偶校验;

CS8|PARENB|PARODD:8位数据位,1位停止位,奇校验;

CS8:8位数据位,1位停止位,无校验;

CS8|STOPB:8位数据位,2位停止位,无校验;

*/

}

4.2 串口接收数据函数

int comReveive (void) //从串口1接收数据函数

{ struct fd_set fds_data; // select函数查询的位置

char accept _buf[1000]; //申请接收缓冲区

while(1)

{

FD_ZERO(&fds_data);//位码置零

FD_SET(sfd,&fds_data);

/*初始化位码,fds_data类似一个数组,这里把sfd对应的位置置成1,select就会查询此位置了*/

//任务阻塞等待读串口准备完毕;

if(select(sfd +1,&fds_data,NULL,NULL,NULL)==ERROR)

/*最后一个参数NULL 是超时返回时间,可以设置一个timeval 类型时间做参数,多长时间收不到数据做相应的处理。NULL 是永远不超时。参见select 函数说明。*/

return(ERROR);

read(sfd, accept _buf,sizeof(accept _buf)); //从串口读字符

/*read函数返回实际读到的数据长度,应用上可以记录此长度做其他处理。Read函数也可能出错,参见read函数说明。*/

/*

用户自定义添加数据处理过程。

*/

}

}

4.3 串口发送数据函数

int comSend(void) //向串口1发送数据函数

{ char *send_buf =” Data had accept!”; //待发送数据

write(sfd,send_buf,sizeof(send_buf)) ;

/*如果是单双工串口RS485,发送数据之前应检查链路上是否有数据,或者有使能接收和使能发送控制端。*/

}

4.4 关闭串口

close(sfd);

5.结束语

本文通过对实时操作系统vxworks的研究,提供了基于vxworks串口通信编程的示例程序及详细说明。目前已经在我们PowerPC平台下MPC8309主板通信管理机中获得了大量应用。该方法可将其串口通信适用于工业控制,自动化等多方面,具有广泛的适应性。程序为笔者使用的实际程序,可直接用于Tornodo及workbench中。

参考文献

[1]孔祥营,柏桂枝.嵌入式实时操作系统vxworks及其开发环境Tornodo[M].北京:中国电力出版社,2002,01.

[2]王立磊.基于VxWorks环境与仿真终端的串口通信设计[J].计算机工程与设计,2006,27(15):2808-2809.

[3]李方敏,编著.VxWorks高级程序设计[M].北京:清华大学出版社,2004,05

[4]周启平,张杨,吴琼.VxWorks开发指南与Tornado实用手册[S].北京:中国电力出版社,2004:25-28.

作者简介:边境(1986―),男,大学本科,助理工程师,现供职于哈尔滨电气集团阿城继电器有限责任公司,主要从事嵌入式系统基础研发工作。

上一篇:中等职业学校一体化教学内容构建 下一篇:大数据时代的互联网金融发展研究