在vxware下的vxworks學習串口編程
1 開發主機,就是你的PC拉,要有com1,com2串口哦
2 在vmware下配置好基於x86 pcPentium的vxworks
3 一根串口直連線,這個應該好買的
實現步驟:
1 首先用串口直連線把你的com1和com2連接起來
2 其次,配置vmware的虛擬設備,添加Serial<->com1;Serial2<->com2
如下圖所示:

3 然后,在tornado下配置你的vxworks
默認的vxworks配置組件是包含INCLUDE_TTY_DEV的,所以這步當然不用管了

4 在1的基礎上,運行你的vxworks
啟動后,在shell下devs可以看到/tyCo/0, tyCo/1兩個串口設備

這實際上是邏輯意義上的串口設備
恩,就這么簡單,環境搭建好了 寫個小程序測試一下吧 ^-^
#include <ioLib.h>
#include <stdio.h>
#include <taskLib.h>
#include <sioLib.h>
#include <string.h>
int tyRecv(int fd)
{
int readCnt1;
char rd;
char buff[512];
int i;
FOREVER
{
i=0;
taskDelay(50);
ioctl(fd,FIONREAD,(int) &readCnt1); /* 判斷com2接收數據緩沖區是否有數據到來 */
if(readCnt1>0)
{
while(readCnt1>0)
{
read(fd,&rd,1);
readCnt1--;
buff[i++]=rd;
}
buff[i]='/0';
printf("read '%s' from com2 whose data were sent by com1/n",buff);
}
}
}
int tySend(int fd)
{
int wrtCount;
char buff[]="I am god of war!"; /* 發送內容 */
wrtCount = write(fd,buff,strlen(buff));
printf("write %d bytes to com1/n",wrtCount); /* 寫com1口,然后數據就會通過串口直連線發送到com2方了 */
}
int testMain()
{
int com1_Fd,com2_Fd;
com1_Fd = open("/tyCo/0",2,0) ; /* 打開串口0,即serial<->com1 */
com2_Fd = open("/tyCo/1",2,0); /* 打開串口1,即serial2<->com2 */
/* 設置串口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);
/* 發起接受數據的任務 */
taskSpawn("recv",60,0,0x2000,(FUNCPTR)tyRecv,com2_Fd,0,0,0,0,0,0,0,0,0);
/* 發起發送數據的任務*/
taskSpawn("send",80,0,0x2000,(FUNCPTR)tySend,com1_Fd,0,0,0,0,0,0,0,0,0);
}
下載運行testMain
輸出如下:
write 16 bytes to com1
read 'I am god of war!' from com2 whose data were sent by com1
證明通信成功了
最好說一下注意事項
1 即使vmware不配置serial,serial2,vxworks只要包含TTY組件,起來后,devs都是有/tyCo/x的
這就是說明了這個只是邏輯意義上的物理設備,真正要在vmware下通信,還是要配上PC機的物理串口
2 這個很關鍵,當時我就是沒注意到這點,搞了半天也沒用串口調式助手監測到數據
/tyCo/0 是對應vmware的serial 的
/tyCo/1 是對應vmware的serial2 的
當時我無意間這樣配置的

即我把serial2 用物理串口com1,然后打開串口調試助手,打開com2 監聽數據
然后我的程序這樣,程序的思想是
1 寫方面:打開/tyCo/0,寫com1,然后串口調試助手監聽com2
2 讀方面:發起了收任務,等待com2 發來數據
#include <ioLib.h>
#include <stdio.h>
#include <taskLib.h>
#include <sioLib.h>
#include <string.h>
int tyRecv(int fd)
{
int readCnt1;
char rd;
char buff[512];
int i;
FOREVER
{
i=0;
taskDelay(50);
ioctl(fd,FIONREAD,(int) &readCnt1);
if(readCnt1>0)
{
while(readCnt1>0)
{
read(fd,&rd,1);
readCnt1--;
buff[i++]=rd;
}
buff[i]='/0';
printf("read '%s' from com1 whose data were sent by com2/n",buff);
}
}
}
int testMain()
{
int fd,wrtCount;
char buff[]="I am god of war!";
fd = open("/tyCo/0",2,0) ;
/* 我打開了/tyCo/0 ,但前面說了,/tyCo/0是對應serial的,而我現在vmware只配了serial2 */
/* 所以程序運行沒看到任何期待的結果,解決辦法在后面 */
/* set com1 hardware option */
if ( ERROR==ioctl(fd,FIOBAUDRATE,9600) )
{
printf("can not set BAUDRATE!/n") ;
return ERROR ;
}
if ( ERROR==ioctl(fd,SIO_HW_OPTS_SET,(CLOCAL|CREAD|CS8)&~(HUPCL|STOPB|PARENB)))
{
printf("can not set OPT!/n") ;
return ERROR ;
}
ioctl(fd,FIOFLUSH,0);
wrtCount = write(fd,buff,strlen(buff)); /*write to com1*/
printf("write %d bytes to com1/n",wrtCount);
/* Start receiving task */
taskSpawn("recv",60,0,0x2000,(FUNCPTR)tyRecv,fd,0,0,0,0,0,0,0,0,0);
}
然后運行程序,結果在串口調試助手的接收區怎么也收不到數據
在串口調試助手的發送區發數據,結果我的recv任務也是死活打印不出信息
后來把fd = open("/tyCo/0",2,0) ; 改成fd = open("/tyCo/1",2,0) ;
這樣,就和vmware配置的serial2<->com1對應起來了
然后一切就都OK了
下面就是正常通信的截圖了
串口調試助手com2的接收區受到了com1發來的'I am god of war!'

而vxworks下的收任務也收到了串口調試助手com2的發送區發送來的數據了

