986
汽車大全
vxworks下的串口測試程序
VXWORKS串口設置說明:
一般有這麼幾步:
打開串口
設置串口raw模式,清空輸入輸出的緩衝區
設置波特率,數據位,停止位,校驗方式
便可以開始讀和寫
打開串口:
fd = open("/tyCo/0", O_RDWR, 0);
"/tyCo/0" 串口1的設備名,O_RDWR:open for reading and writing
設置串口raw模式,清空輸入輸出的緩衝區
ioctl(fd,FIOSETOPTIONS,OPT_RAW);
ioctl(fd,FIOFLUSH,0);
ioctl(int fd,int function,int arg);這個函數解釋如下:
function這個參數有如下:(tty)
FIOBAUDRATE |
設置波特率,arg為一整數,表示要設定的波特率 |
FIOGETOPTIONS |
取得設備控製字,arg表示讀出的內容存放的位置 |
FIOSETOPTIONS |
設置設備控製字,arg表示要設置的選項 |
FIOGETNAME |
取得文件描述符對應的文件名,arg存放文件名的緩衝區 |
FIOREAD |
取得輸入緩衝區內未讀取的字符數,arg用於接收結果的整型指針 |
FIOWRITE |
取得輸出緩衝區內的字符個數,arg用於接收結果的整型指針 |
FIOFLUSH |
清空輸入輸出緩衝區的字符 |
FIOCANCEL |
取消讀和寫 |
FIOSETOPTIONS對應的arg有 OPT_LINE,OPT_RAW,OPT_ECHO等等
關於這些的定義,可以在sioLib.h,ioLib.h裏尋找。
設置波特率,數據位,停止位,校驗方式
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位停止位,無校驗;
int SerialOps = 0;
ioctl(fd,FIOBAUDRATE,9600); //9600波特率
SerialOps |= CS8;//8數據位,1位停止位,無校驗
ioctl(fd,SIO_HW_OPTS_SET,SerialOps);//設置
SIO_HW_OPTS_SET(設置硬件選項)是在XXDrv裏的function
SIO_HW_OPTS_SET對應的arg:
CLOCAL |
忽略modem控製信號 |
CREAD |
啟動接收器 |
CSIZE |
指定數據位:CS5~CS8 |
HUPCL |
最後關閉時掛斷modem連接 |
STOPB |
被設置時指定2位停止位,否則1位停止位 |
PARENB |
被設置時啟用奇偶校驗,否則不進行奇偶校驗 |
PARODD |
被設置時啟用奇校驗,否則偶校驗 (PARENB被設置時才有效) |
可以開始讀寫
int read
(
int fd, /* file descriptor from which to read */
char * buffer, /* pointer to buffer to receive bytes */
size_t maxbytes /* max no. of bytes to read into buffer */
)
int write
(
int fd, /* file descriptor on which to write */
char * buffer, /* buffer containing bytes to be written */
size_t nbytes /* number of bytes to write */
)
關於串口的設置,需要參考tty和xxDrv。詳細的還是需要看書的。
下麵舉個例子:在有些的設置需要如下:
fd=open(tyco,2,0);
logMsg("/n%s;fd=%d/n",tyco,fd,0,0,0,0);
ioctl(fd, FIOOPTIONS, OPT_RAW);
ioctl(fd,FIOBAUDRATE,115200); //設置串口波特率為9600bps
ioctl(fd,FIOFLUSH,0);//清空輸入輸出緩衝
//ioctl(fd,SIO_HW_OPTS_SET,CS8|PARENB|PARODD|CLOCAL|CREAD); //設置 8 位數據位,1位停止位,帶校驗位,奇校驗,沒有流控製CLOCAL,使能讀CREAD
//ioctl(fd,SIO_HW_OPTS_SET,CS8|PARENB|CLOCAL|CREAD); //設置 8 位數據位,1位停止位,帶校驗位,偶校驗,沒有流控製CLOCAL,使能讀CREAD
ioctl(fd,SIO_HW_OPTS_SET,CS8|CLOCAL|CREAD); //設置 8 位數據位,1位停止位,帶校驗位,無校驗,沒有流控製CLOCAL,使能讀CREAD
write(fd,str,48);//需放在清緩存後,mpc8280不用。和SIO_HW_OPTS_SET之後,因為會reset串口
上麵粗字體,需要注意。有些需要,有些不需要的。
#include <ioLib.h> #include <stdio.h> #include <taskLib.h> #include <sioLib.h> #include <string.h> /*ioctl(com2_Fd,FIOSETOPTIONS,OPT_RAW);*/ int tyRecv(int fd,int fd2) { int readCnt1; char rd; char buff[512]; int i; FOREVER { i=0; taskDelay(25); ioctl(fd,FIONREAD,&readCnt1); /* 判斷com1接收數據緩衝區是否有數據到來 */ if(readCnt1>0) { while(readCnt1>0) { read(fd,&rd,1); readCnt1--; buff[i++]=rd; taskDelay(1); } buff[i]='\0'; printf("read1 [%s] \n",buff); } i=0; taskDelay(25); ioctl(fd2,FIONREAD,&readCnt1); /* 判斷com2接收數據緩衝區是否有數據到來 */ if(readCnt1>0) { while(readCnt1>0) { read(fd2,&rd,1); readCnt1--; buff[i++]=rd; taskDelay(1); } buff[i]='\0'; printf("read2 [%s] \n",buff); } } } int tySend(int fd,int fd2) { int wrtCount,i; char buff[]=" I am god of war!"; /* 發送內容 */ for(i=0;i<10;i++) { buff[0] = '1'+i; wrtCount = write(fd,buff,strlen(buff)); printf("write1 %d bytes \n",wrtCount); /* 寫com1口,然後數據就會通過串口直連線發送到com2方了 */ taskDelay(60); buff[0] = 'a'+i; wrtCount = write(fd2,buff,strlen(buff)); printf("write2 %d bytes \n",wrtCount); /* 寫com2口,然後數據就會通過串口直連線發送到com2方了 */ taskDelay(60); } } int com1_Fd,com2_Fd; int taskID; int taskID2; int test() { com1_Fd = open("/tyCo/0",2,0) ; /* 打開串口0,即serial<->com1 */ com2_Fd = open("/tyCo/1",2,0); /* 打開串口1,即serial2<->com2 */ ioctl(com1_Fd,FIOSETOPTIONS,OPT_RAW); ioctl(com2_Fd,FIOSETOPTIONS,OPT_RAW); /* 設置串口0,亦即com1的波特率9600,8數據為,1停止位,無校驗位 */ if ( ERROR==ioctl(com1_Fd,FIOBAUDRATE,9600) ) { printf("can not set BAUDRATE!\n") ; return ERROR ; } if ( ERROR==ioctl(com1_Fd,SIO_HW_OPTS_SET,(CLOCAL|CREAD|CS8)&~(HUPCL|STOPB|PARENB))) { printf("can not set OPT!\n") ; return ERROR ; } ioctl(com1_Fd,FIOFLUSH,0); /* 設置串口1,亦即com2的波特率9600,8數據為,1停止位,無校驗位 */ if ( ERROR==ioctl(com2_Fd,FIOBAUDRATE,9600) ) { printf("can not set BAUDRATE!\n") ; return ERROR ; } if ( ERROR==ioctl(com2_Fd,SIO_HW_OPTS_SET,(CLOCAL|CREAD|CS8)&~(HUPCL|STOPB|PARENB))) { printf("can not set OPT!\n") ; return ERROR ; } ioctl(com2_Fd,FIOFLUSH,0); printf("com1:0x%x com2:0x%x!\n",com1_Fd,com2_Fd) ; /* 發起接受數據的任務 */ taskID = taskSpawn("recv",60,0,0x2000,(FUNCPTR)tyRecv,com1_Fd,com2_Fd,0,0,0,0,0,0,0,0); /* 發起發送數據的任務*/ taskSpawn("send",80,0,0x2000,(FUNCPTR)tySend,com1_Fd,com2_Fd,0,0,0,0,0,0,0,0); } void del() { taskDelete(taskID); /*taskDelete(taskID2);*/ close(com1_Fd); close(com2_Fd); }
最後更新:2017-04-03 12:56:21