新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 文件I/O编程之: 嵌入式Linux串口应用编程

文件I/O编程之: 嵌入式Linux串口应用编程

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257136.htm

在本实例中使用tcflush()函数,对于在缓冲区中的尚未传输的数据,或者收到的但是尚未读取的数据,其处理方法取决于queue_selector的值,它可能的取值有以下几种。

n TCIFLUSH:对接收到而未被读取的数据进行清空处理。

n TCOFLUSH:对尚未传送成功的输出数据进行清空处理。

n TCIOFLUSH:包括前两种功能,即对尚未处理的输入输出数据进行清空处理。

如在本例中所采用的是第一种方法:

tcflush(fd,TCIFLUSH);

9.激活配置

在完成全部配置之后,要激活刚才的配置并使配置生效。这里用到的函数是tcsetattr(),它的函数原型是:

tcsetattr(intfd,intoptional_actions,conststructtermios*termios_p);

其中参数termios_p是termios类型的新配置变量。

参数optional_actions可能的取值有以下3种:

n TCSANOW:配置的修改立即生效。

n TCSADRAIN:配置的修改在所有写入fd的输出都传输完毕之后生效。

n TCSAFLUSH:所有已接受但未读入的输入都将在修改生效之前被丢弃。

该函数若调用成功则返回0,若失败则返回-1,代码如下所示:

if((tcsetattr(fd,TCSANOW,new_cfg))!=0)

{

perror(tcsetattr);

return-1;

}

下面给出了配置的完整函数。通常,为了函数的通用性,通常将常用的选项都在函数中列出,这样可以大大方便以后用户的调试使用。该设置函数如下所示:

intset_com_config(intfd,intbaud_rate,

intdata_bits,charparity,intstop_bits)

{

structtermiosnew_cfg,old_cfg;

intspeed;

/*保存并测试现有参数设置,在这里如果串口号等出错,会有相关的出错信息*/

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操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程




评论


相关推荐

技术专区

关闭