閱讀986 返回首頁    go 汽車大全


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

  上一篇:go Microsoft Visual Studio與Firefly 一直提示加載項目,更新源碼狀態問題
  下一篇:go DevExpress TreeList控件的複選框