Linux串口測試工具簡單程序代碼解析
由于已經(jīng)完成了第一個HELLO程序,標(biāo)志著整個編譯環(huán)境已經(jīng)沒有問題了,下來準(zhǔn)備做一下串口測試程序。由于串口驅(qū)動開發(fā)板已經(jīng)作好了,所以就作一個Linux串口測試工具簡單的數(shù)據(jù)收發(fā)看看。
Linux串口測試工具網(wǎng)上常見的版本都看起來比較煩瑣,下面是一個簡單一點(diǎn)的,這個程序功能是收到10個字節(jié)后會發(fā)前7個字節(jié),如果所發(fā)的數(shù)據(jù)的第一個字節(jié)是9則退出。
/* rs232_send.c*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineBAUDRATEB115200//38400
#defineMODEMDEVICE"/dev/ttyS1"
int main()
{
int fd,c=0,res;
struct termios oldtio,newtio;
intch;
static char s1[20],buf[19];
printf("start ...\n");
/*打開PC的COM1口*/
fd = open(MODEMDEVICE,O_RDWR|O_NOCTTY);
if (fd
{
perror(MODEMDEVICE);
exit(1);
}
printf("open...\n");
/*將舊的通訊參數(shù)存入oldtio結(jié)構(gòu)*/
tcgetattr(fd,&oldtio);
/*初始化新的newtio */
bzero(&newtio,sizeof(newtio));
/*8N1*/
newtio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
/*正常模式*/
/*newtio.c_lflag = ICANON;*/
/*非正常模式*/
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 10;
tcflush(fd,TCIFLUSH);
/*新的temios作為通訊端口參數(shù)*/
tcsetattr(fd,TCSANOW,&newtio);
printf("writing...\n");
while(1)
{
res = read(fd,buf,10);
res = write(fd,buf,7);
if(buf[0]==9) break;
}
printf("close...\n");
close(fd);
/*還原舊參數(shù)*/
tcsetattr(fd,TCSANOW,&oldtio);
return 0;
}
還有一點(diǎn)要注意,就是Linux串口測試工具串口有兩種工作模式,即正規(guī)模式和非正規(guī)模式,如果習(xí)慣在串口調(diào)試器中用16進(jìn)制發(fā)送,此時串口應(yīng)該為非正規(guī)模式才行。
下面是這兩種模式的說明
Linux串口測試工具正規(guī)模式(CANONICAL或者COOKED)
此模式下,終端設(shè)備會處理特殊字符,并且數(shù)據(jù)傳輸是一次一行的方式,既按回車后才開始發(fā)送和接收數(shù)據(jù)。例如LINUX的SHELL。
Linux串口測試工具非正規(guī)模式(NON-CANONICAL或者RAW)
此模式下,終端設(shè)備不會處理特殊字符,并且數(shù)據(jù)傳輸是一次一個字符的方式,既不用按回車換行。例如LINUX的VIM。
【編輯推薦】