串口在嵌入式系统当中是一类重要的数据通信接口,其本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位;在接收数据时,串行的位被转换为字节数据。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。
串口通信的优点是开发简单,在传输数据量不大、要求速度不高而传输距离较大的通信场合得到广泛应用,,在调试程序中被广泛应用。
在VxWorks中,将I/O系统设计成为任何类型的设备提供一个简单、统一、独立于设备的接口,任何对于串口的操作都可以视为对一个文件的操作,而不必了解串口设备或程序驱动实现的细节。在串口通信软件的设计中,当串口初始化完成后,在使用之前利用open()打开相应串口,然后进行配置。
VxWorks提供终端和伪终端设备驱动。Tty驱动针对实终端;pty针对仿真终端的程序。Tty设备有两种操作模式:raw模式和line模式。在raw模式下,每个刚从设备输入的字符对读者都是有效的;在line模式下所有输入字符被存储,直到NEWLINE字符输入。设备选项字使用带FIOSETOPTIONS 功能的ioctl()程序来设置。配置完成后,依据串口打开时的读写标志,调用函数write()、read()对串口进行只读操作、只写操作或同时进行读写操作。为提高数据接收的实时性,可采用中断方式,利用VxWorks提供的select函数的事件触发机制,将读串口的任务阻塞使其一直等待数据,当有数据来到的时候该任务会立刻自动响应,提高系统的实时性。
用户1124127 2007-5-9 17:46
用户1053025 2006-9-26 14:00
shenyandetongxing_551209819 2006-9-25 23:53
vxowrks应用串口在程序中加入下列头文件
#include <vxWorks.h>
#include "strLib.h"
#include <string.h>
#include <sioLib.h>
#include <ioLib.h>
#include <stdio.h>
#include <ioctl.h>
#include <selectLib.h>
#include "types/vxTypesOld.h"
打开串口
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 !");
}
配置串口
int config_com1(void) //串口1配置函数
{ ioctl(sfd,FIOSETOPTIONS,OPT_LINE); //设置串口工作模式为行模式:LINE_MODE
ioctl(sfd,FIOBAUDRATE,9600); //设置串口波特率为9600bps
ioctl(sfd,FIOFLUSH,0); //清空输入输出缓冲
ioctl(sfd,SIO_HW_OPTS_SET,CS8|STOPB|PARENB|PARODD);
//设置 8 位数据位,2位停止位,带校验位,奇校验
}
串口接收数据
int accept _com1(void) //从串口1接收数据函数
{ while(1)
{ char * accept _buf;
FD_ZERO(&fds_data);//位码置零
FD_SET(sfd,&fds_data);//初始化位码
width=sfd +1;
//任务阻塞等待读串口准备完毕;
if(select(width,&fds_data,NULL,NULL,NULL)==ERROR)
return(ERROR);
read(sfd, accept _buf,sizeof(accept _buf)); //从串口读字符
printf("accept message is : %s \n\n", accept _buf); //输出接收到的信息
}
}
串口发送数据
int send_com1(void) //向串口1发送数据函数
{ char *send_buf =" Data had accept!"; //待发送数据
//任务阻塞等待写串口准备完毕
if(select(width,NULL,&data_fds,NULL,NULL==ERROR)
return(ERROR) ;
if(FD_ISSET(sfd,&fds_data)) //检查串口准备好就向串口写数据
write(sfd,send_buf,sizeof(send_buf)) ;
}
关闭串口
close(sfd);
shenyandetongxing_551209819 2006-9-25 23:35
,数据)写。但是这种方法是不可靠的。我个人就是我们为什么驱邪驱动的原因之一。
shenyandetongxing_551209819 2006-9-25 23:20
#include "vxWorks.h"
#include "tffs/flsocket.h"
#include "tffs/pcic.h"
#define COM1_PORT 0x3F8
void com1_init(void)
{
int data;
sysOutByte(COM1_PORT+3,0x80); /* DLAB=1, set baud*/
sysOutByte(COM1_PORT,0x0c); /* 波特率 0x30:2400 0x18:4800 0x0c:9600*/
sysOutByte(COM1_PORT+2,0x87);
sysOutByte(COM1_PORT+2,0x81);
sysOutByte(COM1_PORT+1,0x00);
sysOutByte(COM1_PORT+3,0x03); /*data length: 8 , stop bits: 1*/
sysOutByte(COM1_PORT+4,0x0b);
/*outportb(COM1_PORT+1,0x01); // receive interrupt enable*/
sysInByte(COM1_PORT);
}
再加上些中断处理函数就是完整的驱动了。
shenyandetongxing_551209819 2006-9-25 23:13
ioctl(fd,FIONREAD,(int)&iNum);
if(iNum>0){read();...}
shenyandetongxing_551209819 2006-9-25 23:04