Linux串口是连接许多外围设备的重要接口,因此掌握linux串口的设置十分的重要。

Linux串口设置主要分为四步:

       第一:打开需要使用的串口设备

       第二:获取该串口设备的属性

       第三:根据应用设置该串口的属性

       第四:将设置生效

第一步:打开串口设备

fd = open(serialDev,O_RDWR | O_NOCTTY);
//第一个参数为打开的串口设备名

//第二个参数为打开设备的方式,O_RDWR以读写方式打开,O_NOCTTY该设备端口不成为该程序的控制终端

第二步:获得串口设备的属性

#include     <termios.h>
struct termios oldtio,newtio;
int tcgetattr(int fd,struct termios *termios_p)

第三步:设置串口(关键)

3.1 设置波特率

struct termios Opt;
tcgetattr(fd, &Opt);
cfsetispeed(&Opt,B19200); /*设置为19200Bps*/
cfsetospeed(&Opt,B19200);

3.2 设置数据位

struct termios options;
tcgetattr( fd,&options);
switch (databits) 
{
  case 6:options.c_cflag |= CS6; break;//6位数据位
  case 7:options.c_cflag |= CS7; break;//7位数据位
  case 8:options.c_cflag |= CS8; break; //8为数据位         
}
3.3 设置停止位
struct termios options;
tcgetattr( fd,&options);
switch (stopbits)
{
  case 1:options.c_cflag &= ~CSTOPB;break;//每个字符1个停止位
  case 2:options.c_cflag |=  CSTOPB;break;//每个字符2个停止位
}

3.4 设置奇偶校验

struct termios options;
tcgetattr( fd,&options);

options.c_cflag &= ~PARENB;//关闭奇偶校验
options.c_iflag &= ~INPCK; 

options.c_cflag |= (PARODD | PARENB); //设置为奇效验
options.c_iflag |= INPCK; 

options.c_cflag |= PARENB;//设置为偶校验
options.c_cflag &= ~PARODD; 
options.c_iflag |= INPCK; 

3.5 设置标准模式和非标准模式

标准模式一般就是系统默认的模式,在标准模式下用户的输入一般要按下enter键后,用户的输入才会被应用程序接收到,并且用户按的回车键自动会转换为换行符。但是英语程序要求终端一有数据就能立即响应,而不是等到用户按下enter键的话,就得设置为为标准模式。

struct termios options;
tcgetattr(fd,&options);
options.c_lflag&= ~(ICANON | ECHO | ECHOE | ISIG);//设置为非标准模式,输入在终端不显示,不启用组合按键

在非标准模式下用户可以设置成串口一旦有数据就程序就立即可读

options.c_cc[VTIME] = 0;
options.c_cc[VMIN]  = 0;

第四步:使设置生效

当程序设置好串口的配置后必须使其生效才能使用,但是每次开机后,配置会恢复到默认值。

tcsetattr(fd,TCSAFLUSH,&options);
TCSANOW:   不等数据传输完毕就立即改变属性
TCSADRAIN: 等待所有数据传输结束才改变属性
TCSAFLUSH:   清空输入输出缓冲区才改变属性

Linux串口设置实例

fd = open(serialDev,O_RDWR | O_NOCTTY);
if(fd<0)
{
    printf("can not open the serialDev\n");
    return -1;
}
tcflush(fd,TCIFLUSH);//刷新
tcgetattr(fd,&newtio);//获得原先串口配置
	  
cfsetispeed(&newtio,B38400);//设置输入的波特率为38400
cfsetospeed(&newtio,B38400);//设置输出的波特率为38400
	  
newtio.c_cflag |= CS8;      //8位数据位,1位停止位
newtio.c_cflag &= ~CSTOPB;  
newtio.c_cflag &= ~PARENB;  //无奇偶校验
newtio.c_oflag &= ~(OPOST); //关闭输出
   
newtio.c_lflag &= ~(ISIG|ECHO|IEXTEN); //关闭组合按键,关闭回显
newtio.c_iflag &= ~(INPCK|BRKINT|ICRNL|ISTRIP|IXON |INLCR);
newtio.c_iflag |=IGNCR;     //忽略接受到回车符
    	  
if(tcsetattr(fd,TCSAFLUSH,&newtio)<0)//使设置生效
{
    printf("tcsetattr failed!\n");
    return -1;
}






Logo

更多推荐