在PX2開發(fā)板上有個(gè)已引出的的ttys3,大家如果用PX2來開發(fā)或者學(xué)習(xí),時(shí)不時(shí)總是會(huì)需要用到這個(gè)串口的,而在android系統(tǒng)中,使用串口的方式也很簡單,因?yàn)樵赑X2的源碼中已經(jīng)有了ttys3的驅(qū)動(dòng),我們只需要將起編譯進(jìn)內(nèi)核(編譯fangshihttp://bbs.chipspark.com/forum.p ... =%E4%B8%B2%E5%8F%A3)就可以像操作文件一樣,操作這個(gè)串口,然后操作這個(gè)串口的時(shí)候,我們需要做的也只有先做個(gè)初始的配置,就是設(shè)置波特率,停止位,數(shù)據(jù)位,奇偶校驗(yàn)。 注:ttys3的連接如果是DB9腳的,理論上只連接RX ,TX,GND便可工作。樓主便是用這個(gè)的 1.串口的配置, 串口的配置是利用POSIX終端的termios結(jié)構(gòu) termios 結(jié)構(gòu)定義如下 struct termios { tcflag_t c_iflag /* 輸入選項(xiàng)標(biāo)志 */ tcflag_t c_oflag /* 輸出選項(xiàng)標(biāo)志 */ tcflag_t c_cflag /* 控制選項(xiàng)標(biāo)志 */ tcflag_t c_lflag /* 本地選項(xiàng)標(biāo)志 */ cc_t c_cc[NCCS] /* 控制特性 */ } 而部分參數(shù)的作用參考附件中的內(nèi)容 ![]() 核心主要配置波特率,校驗(yàn)位,數(shù)據(jù)位,停止位, 而樓主自己寫的驅(qū)動(dòng)如下,其中的設(shè)置為波特率115200,無效驗(yàn),八位數(shù)據(jù)位,一位停止位, #include #include #include #include #include #include #include #include #include int OpenDev(char *Dev){ int fd = open( Dev, O_RDWR ) if (-1 == fd){ perror("Can't Open Serial Port") return -1 } else return fd } int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop){ struct termios newios,oldios if(tcgetattr(fd, &oldios)!=0){ //獲取之前定義的終端值 perror("setupserial 1") return -1 } bzero(&newios,sizeof(newios))//將newios結(jié)構(gòu)體里的數(shù)據(jù)重新設(shè)置為0 newios.c_cflag|=CREAD//使能讀和 newios.c_cflag&=~CSIZE//字符長度掩碼 switch(nBits){ case 7:newios.c_cflag|=CS7break case 8:newios.c_cflag|=CS8break } switch(nEvent){ case '0': newios.c_cflag|=PARENB newios.c_cflag|=PARODD newios.c_cflag|=(INPCK|ISTRIP)//偶校驗(yàn) break case '1': newios.c_cflag|=PARENB newios.c_cflag&=~PARODD//奇校驗(yàn) break case 'N': newios.c_cflag&=~PARENB//無校驗(yàn) break } switch(nSpeed){//設(shè)置波特率 case 2400: cfsetispeed(&newios,B2400) cfsetospeed(&newios,B2400) break case 4800: cfsetispeed(&newios,B4800) cfsetospeed(&newios,B4800) break case 9600: cfsetispeed(&newios,B9600) cfsetospeed(&newios,B9600) break case 115200: cfsetispeed(&newios,B115200) cfsetospeed(&newios,B115200) break default: cfsetispeed(&newios,B115200) cfsetospeed(&newios,B115200) break } if(nStop==1) newios.c_cflag&=~CSTOPB//一停止位 else if (nStop==2) { newios.c_cflag|=CSTOPB//兩停止位 newios.c_cc[VTIME]=0//無延時(shí) newios.c_cc[VMIN]=0//無附加 tcflush(fd,TCIOFLUSH)//刷新輸出隊(duì)列 } newios.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO)//原始數(shù)據(jù)輸入 newios.c_oflag &= ~OPOST//原始數(shù)據(jù)輸出 if(tcsetattr(fd,TCSANOW,&newios)!=0)//將配置賦予POSIX終端 { perror("com set error") return -1 } printf("set done\n") return 0 } int main(int argc, char **argv){ int fd int nread,nwrite char buff[8] char *dev = "/dev/ttyS3" //串口3 char bufsend[8] fd = OpenDev(dev) if (set_opt(fd,115200,8,'N',1) == FALSE) { printf("Set Parity Errorn") exit (0) } memset(buff,0,8*sizeof(char)) if(strcmp(argv[1],"receive")==0) { while(1){ while((nread = read(fd, buff, 8))>0) //讀數(shù)據(jù),在死循環(huán)中不斷等待,輸出數(shù)據(jù), { printf("receive %d ",nread) printf( "\n%s", buff) }}} memset(bufsend, 0,8*sizeof(char))//清空數(shù)據(jù)棧 if(strcmp(argv[1],"send")==0){//發(fā)送數(shù)據(jù),類型字符 printf("send message: ") fgets(bufsend,8,stdin) printf("\n%s",bufsend) nwrite=write(fd,bufsend,8) } close(fd) exit (0) } 2.程序測(cè)試, 確認(rèn)連接無誤后,樓主開始發(fā)送數(shù)據(jù),但是,雖然正常實(shí)現(xiàn)串口的通信,但是發(fā)送的數(shù)據(jù)卻是亂碼,一開始樓主發(fā)送了111111111111,而接受到的數(shù)據(jù)是ggggggggggg,其接收到的即不是ascii碼,而對(duì)應(yīng)的十六進(jìn)制是67,具體的問題樓主還在研究,估計(jì)還得過段時(shí)間,才能解決這個(gè)問題,按樓主的估計(jì)可能性有兩個(gè),一個(gè)是樓主是使用DB9接口的,只連了三根線,并沒有VCC,會(huì)不會(huì)是這個(gè)有影響,二,樓主配置串口時(shí),只做了基本配置,或許是某個(gè)配置出錯(cuò)了。這里先放到論壇上分享給大家,后續(xù)再繼續(xù)補(bǔ)充,與大家共勉。 串口調(diào)試助手: ![]() |