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串口
上面粗字體,需要注意。有些需要,有些不需要的。