文件I/O編程之: 嵌入式Linux串口應用編程
在本實例中使用tcflush()函數(shù),對于在緩沖區(qū)中的尚未傳輸?shù)臄?shù)據(jù),或者收到的但是尚未讀取的數(shù)據(jù),其處理方法取決于queue_selector的值,它可能的取值有以下幾種。
n TCIFLUSH:對接收到而未被讀取的數(shù)據(jù)進行清空處理。
n TCOFLUSH:對尚未傳送成功的輸出數(shù)據(jù)進行清空處理。
n TCIOFLUSH:包括前兩種功能,即對尚未處理的輸入輸出數(shù)據(jù)進行清空處理。
如在本例中所采用的是第一種方法:
tcflush(fd,TCIFLUSH);
9.激活配置
在完成全部串口配置之后,要激活剛才的配置并使配置生效。這里用到的函數(shù)是tcsetattr(),它的函數(shù)原型是:
tcsetattr(intfd,intoptional_actions,conststructtermios*termios_p);
其中參數(shù)termios_p是termios類型的新配置變量。
參數(shù)optional_actions可能的取值有以下3種:
n TCSANOW:配置的修改立即生效。
n TCSADRAIN:配置的修改在所有寫入fd的輸出都傳輸完畢之后生效。
n TCSAFLUSH:所有已接受但未讀入的輸入都將在修改生效之前被丟棄。
該函數(shù)若調用成功則返回0,若失敗則返回-1,代碼如下所示:
if((tcsetattr(fd,TCSANOW,new_cfg))!=0)
{
perror(tcsetattr);
return-1;
}
下面給出了串口配置的完整函數(shù)。通常,為了函數(shù)的通用性,通常將常用的選項都在函數(shù)中列出,這樣可以大大方便以后用戶的調試使用。該設置函數(shù)如下所示:
intset_com_config(intfd,intbaud_rate,
intdata_bits,charparity,intstop_bits)
{
structtermiosnew_cfg,old_cfg;
intspeed;
/*保存并測試現(xiàn)有串口參數(shù)設置,在這里如果串口號等出錯,會有相關的出錯信息*/
if(tcgetattr(fd,old_cfg)!=0)
{
perror(tcgetattr);
return-1;
}
/*設置字符大小*/
new_cfg=old_cfg;
cfmakeraw(new_cfg);/*配置為原始模式*/
new_cfg.c_cflag=~CSIZE;
/*設置波特率*/
switch(baud_rate)
{
case2400:
{
speed=B2400;
}
break;
case4800:
{
speed=B4800;
}
break;
case9600:
{
speed=B9600;
}
break;
case19200:
{
speed=B19200;
}
break;
case38400:
{
speed=B38400;
}
break;
default:
case115200:
{
speed=B115200;
}
break;
}
cfsetispeed(new_cfg,speed);
cfsetospeed(new_cfg,speed);
/*設置停止位*/
switch(data_bits)
{
case7:
{
new_cfg.c_cflag|=CS7;
}
break;
default:
case8:
{
new_cfg.c_cflag|=CS8;
}
break;
}
/*設置奇偶校驗位*/
switch(parity)
{
default:
case'n':
case'N':
{
new_cfg.c_cflag=~PARENB;
new_cfg.c_iflag=~INPCK;
}
break;
case'o':
case'O':
{
new_cfg.c_cflag|=(PARODD|PARENB);
new_cfg.c_iflag|=INPCK;
}
break;
case'e':
case'E':
{
new_cfg.c_cflag|=PARENB;
new_cfg.c_cflag=~PARODD;
new_cfg.c_iflag|=INPCK;
}
break;
case's':/*asnoparity*/
case'S':
{
new_cfg.c_cflag=~PARENB;
new_cfg.c_cflag=~CSTOPB;
}
break;
}
/*設置停止位*/
switch(stop_bits)
{
default:
case1:
{
new_cfg.c_cflag=~CSTOPB;
}
break;
case2:
{
new_cfg.c_cflag|=CSTOPB;
}
}
/*設置等待時間和最小接收字符*/
new_cfg.c_cc[VTIME]=0;
new_cfg.c_cc[VMIN]=1;
/*處理未接收字符*/
tcflush(fd,TCIFLUSH);
/*激活新配置*/
if((tcsetattr(fd,TCSANOW,new_cfg))!=0)
{
perror(tcsetattr);
return-1;
}
return0;
}
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關文章:linux教程
評論