以下例子的运行环境是装载 Vxworks的两台PC机,pc机之间用串口COM2连接.为了把要讨论的问题更明显的表现出来,例子将简化一些和串口通信不直接相关的内容,并忽视错误处理和 Vxworks的一些编程约定(coding conventions).
函数void usrApplnit(void)后追加语句:
tty_send();
代码如下:
#include "vxworks.h"
#include "stdio.h"
#include "taskLib.h"
#include "ioLib.h"
int tty_send(void)
{
int fd;
int bytes_out;
char buff ]="Serial commuciation妙pc com2"; //待发送的字符串
ttyDrv(); //把申口驱动程序添加到系统中
//下面语句把申口 com2添加到系统中," tyC0/l"是设备名,
sysSerialChanGet(1)用来获得指向串口描述符的指针,后面两个参数定义了读缓冲区和写缓冲区的大小。
ttyDevCreate("/tyCo/1",sysSerialChanGet(l),512,512);
//以可读可写方式打开串口2,获得串口2的文件描述符
fd="open"("/tyCo/1",O_RDWR);
//设置串口2的数据模式
ioctl(fd,FIOSETOPTIONS,OPT_PAW);
//设置串口 2的波特率/
ioctl(fd,FIOBAUDP,ATE,9600);
//把字符串buf反复的送往串口
while(l)
{
byteses out="write"(fd,buf strlen(buf));
printf("output chars total: "/"d\n",bytes out);
taskDelay(60);
//关闭串口2
close(fd);
return l;
接收端代码
以下代码也可以单独保存在一个文件中,和其他所有文件一同编译。在usrApplnit.c中的函数void usrApplnit(void)后追加语句:
tty_receive();
代码如下:
#include "vxworks.h"
#include "stdio.h"
#include'SoLib.h"
#include "selectLib.W
inttty_receive(void)
{
int i,j;
int fd,width;
int bytes in;
char buf]10];
struct fd set_readFds;
//注释同上
ttyDrv();
//注释同上
ttyDevCreate("ItyColl",sysSerialChanGet(1),512,512);
// 注释同上
fd="open"("/tyCo/1",O_RDWR);
ioctl(fd,FIOSETOPTIONS,OPT_RAW); //注释同上
ioctl(fd,FIOBAUDRATE,9600); //注释同上
//下边语句用”lect函数将任务阻塞在申口2进行读操作
FD_ZERO(&readFds); //清空被读监控的文件描述符集
//串口2的文件描述符在被读监控的文件描述符集中It相应的位 N
FD_SET(fd,&readFds);
width="fd"+l;
//将任务阻塞在串 口2进行读操作
if(select(width,&readFds,NULL,NULL,NULL)==ERROR)
return(ERROR);
//如果可以读串口,就进行读操作
if(FD_ISSET(fd,&readFds))
{
while(1)
if( (bytes_in="read"(fd,buf,7)) - 0)
break;
for(i-O;i<bytesLin;i++)
printrf("%c",buf);
}
//关闭串口2
close(fd);
return 1;
上边的两段代码简要的实现了两个Vxworks系统之间的串口通信。意图在于以例子说明前面叙述的串口驱动原理并为串口通信提供一个基本的编程参考。如果在上述代码中再加入一些错误处理和宏定义、对代码进行适当的封装、采用更好的c程序设计方法,就能得到更健壮、更好用、功能更强的串口通信程序。
文章评论(0条评论)
登录后参与讨论