首页 - 信息 - 分析linux tcsetattr中的设置及应用(linux tcsetattr)

分析linux tcsetattr中的设置及应用(linux tcsetattr)

2023-10-03 04:22

在Linux系统编程中,经常需要使用串口进行通信。不过这种串口通信对设备依赖性很强,所以在写程序的时候通常需要用到一些。控制串口的函数,其中最常用的是tcsetattr函数。

tcsetattr函数可以设置串口的一些参数,包括波特率、数据位、停止位、校验位等。在本文中,我们将深入了解tcsetattr函数的设置和应用。

1。 tcsetattr函数的基本原理

tcsetattr函数的作用是设置串口的一些参数,主要包括以下几个方面:

① 设置波特率

波特率代表每秒传输的位数,也就是串行通信的速度。要设置波特率,可以使用以下代码:

“`c

结构 termios 选项;

tcgetattr(fd,&选项); // 获取串口属性

cfsetspeed(&选项,B115200); //设置波特率为115200

tcsetattr(fd,TCSANOW,&选项); // 有效

“`

其中cfsetspeed函数是设置波特率的函数。第一个参数是termios结构体的指针,第二个参数是设置的波特率值。

② 设置数据位

数据位表示每个字符占用的位数。常用的数据位有5、6、7、8位。要设置数据位,您可以使用以下代码:

“`c

options.c_cflag &= ~CSIZE; // 清除原来的数据位设置

options.c_cflag |= CS8; //设置数据位为8位

“`

其中,CSIZE是宏定义,表示数据位,CS8表示数据位为8位。

③ 设置停止位

停止位用于表示两个字符之间的间隔。常用的停止位有1、1.5、2位。要设置停止位,可以使用以下代码:

“`c

options.c_cflag &= ~CSTOPB; // 设置停止位为1位

“`

其中,CSTOPB是宏定义,表示停止位。指定为 0 表示将停止位设置为 1。

④ 设置校验位

校验位用于检测数据是否传输错误。常用的校验位有无、偶数和奇数。要设置校验位,您可以使用以下代码:

“`c

options.c_cflag &= ~(PARENB | PARODD); // 将校验位设置为无

“`

其中PARENB、PARODD为宏定义,表示是否启用奇偶校验。将它们都指定为 0 意味着将检查位设置为 None。

2。如何使用tcsetattr函数

tcsetattr 函数具有以下参数:

① fd:文件描述符,即串口通信所需的设备文件。

②Optional_actions:控制读写行为的标志,有以下值:

–TCSANOW:成立后立即生效。

– TCSADRN:数据传输完成后生效。

– TCSAFLUSH:数据传输完成且输入输出缓冲区清空后生效。

③ termios_p:包含串口配置信息的结构体指针。该结构体在使用前需要初始化。

我们需要创建一个termios结构体,其中包含了串口的很多属性。这是示例代码:

“`c

结构 termios 选项;

if(tcgetattr(fd,&选项)!= 0){

perror(“tcgetattr 错误”);

返回;

}

“`

tcgetattr函数用于获取串口属性。具体用法上面已经说过了。

接下来,我们需要在结构中设置各种属性。例如,要设置波特率,您可以使用以下代码:

“`c

//设置波特率

cfsetspeed(&选项,B115200);

“`

其中cfsetspeed函数用于设置波特率。第一个参数是termios结构体的指针,第二个参数是设置的波特率值。

然后,我们需要设置数据位、停止位、校验位等属性,具体用法上面已经提到了,这里不再重复。

我们需要使用tcsetattr函数来使设置的属性生效。这是示例代码:

“`c

//设置的属性生效

if(tcsetattr(fd,TCSANOW,&选项)!= 0){

perror(“tcsetattr 错误”);

返回;

}

“`

其中,第一个参数是文件描述符,第二个参数是控制读写行为的标志位(验证模式),第三个参数是包含串口配置信息的结构体指针。

3。 tcsetattr 函数的错误处理

使用tcsetattr函数时,出现异常时需要进行错误处理,避免程序崩溃或其他严重后果。

调用tcgetattr函数获取串口属性时,如果读取失败将返回-1,并设置errno错误码。因此,我们需要错误处理,这里是示例代码:

“`c

if(tcgetattr(fd,&选项)!= 0){

perror(“tcgetattr 错误”);

返回;

}

“`

perror函数用于打印错误信息。该函数会将错误信息打印到屏幕上,并在末尾添加换行符。

调用tcsetattr函数设置串口属性时,如果设置失败,将返回-1,并设置errno错误码。因此,我们需要错误处理,这里是示例代码:

“`c

if(tcsetattr(fd,TCSANOW,&选项)!= 0){

perror(“tcsetattr 错误”);

返回;

}

“`

还可以使用perror函数来打印错误信息。

4。

tcsetattr函数是Linux系统下串口通信的必备函数。它可以设置串口的一些属性,包括波特率、数据位、停止位、校验位等,以达到不同的通信效果。

使用tcsetattr函数时,需要了解该函数的参数及其用法,并需要进行错误处理,以保证程序的健壮性。

相关问题延伸阅读:

  • 如何解决Linux下串口通信丢失字节的问题
  • 在Linux嵌入式系统中,更改串口波特率不生效

如何解决Linux下串口通信丢失字节的问题

int con=atoi(portstr);

unsigned char 端口文件名;

int fd0,rc;

结构 termios ts0;

开关(con)

{ //选项O_NOCTTY表示该串口不能作为控制终端,否则用户的键盘输入信息会影响程序的执行

//O_NDELAY表示打开串口时,程序不关心另一端串口是否正在使用

情况 1:fd0=open(“/dev/ttyM0”,O_RDWR | O_NOCTTY | O_NDELAY);休息;

情况 2:fd0=open(“/dev/ttyM1”,O_RDWR | O_NOCTTY | O_NDELAY);休息;

情况3:fd0=open(“/dev/ttyM2”,O_RDWR | O_NOCTTY | O_NDELAY);休息;

情况 4:fd0=open(“/dev/ttyM3”,O_RDWR | O_NOCTTY | O_NDELAY);休息;

情况 5:fd0=open(“/dev/ttyM4”,O_RDWR | O_NOCTTY | O_NDELAY);休息;

情况 6:fd0=open(“/dev/ttyM5”,O_RDWR | O_NOCTTY | O_DELAY);休息;

情况7:fd0=open(“/dev/ttyM6”,O_RDWR | O_NOCTTY | O_DELAY);休息;

情况 8:fd0=open(“/dev/ttyM7”,O_RDWR | O_NOCTTY | O_DELAY);休息;

默认:fd0=open(“/dev/ttyM0”,O_RDWR | O_NOCTTY | O_DELIVERY);休息;

}

tcgetattr(fd0,&ts0);

bzero(&ts0,sizeof(struct terms));

开关(gytype)

{

情况 1:{ts0.c_cflag |= B300 | CS7 |当地 |信用 |帕伦布;

ts0.c_cflag &= ~PARODD; // 移除键盘

ts0.c_flag |= INPCK; // 禁用奇偶校验检查

打破; }

情况 2:{ts0.c_cflag |= B1200 | CS8 |当地 |信用 |帕伦布;

ts0.c_cflag &= ~PARODD; //更新雪花

ts0.c_flag |= INPCK; // 禁用奇偶校验检查

打破;

}

情况3:{

ts0.c_cflag |= B9600 | CS8 |当地 |信用;

ts0.c_cflag &= ~PARENB; // 清除奇偶校验使能

ts0.c_iflag &= ~INPCK; // 启用奇偶校验

打破;

}

情况 4:{ts0.c_cflag |= B9600 | CS8 |当地 |信用 |帕伦布;

ts0.c_cflag &= ~PARODD; // 转换为均匀效果测试

ts0.c_iflag |= INPCK; // 禁用奇偶校验检查

打破;

}

}

ts0.c_lflag &= ~ECHO;

ts0.c_lflag &= ~ECHONL;

ts0.c_iflag &= ~IXOFF;

ts0.c_iflag &= ~IXON;

ts0.c_cflag &= ~CSIZE;

开关(gytype)

{

情况 1:{ts0.c_cflag |= CS7 ;打破;}

情况 2:{ts0.c_cflag |= CS8 ;打破;}

情况 3:{ts0.c_cflag |= CS8 ;打破;}

情况 4:{ts0.c_cflag |= CS8 ;打破;}

}

ts0.c_lflag &= ~ICANON; //如果设置启用规范输入,否则使用原始数据(本文使用)

ts0.c_oflag &= ~ONLCR; //如果设置,将NL转换为CR-NL并输出

ts0.c_iflag &= ~INLCR; //如果设置,则将接收到的NL(换行)转换为CR(回车)。

ts0.c_cc = 0; //最小可读数据

ts0.c_cc = 0; //数据等待时间(10秒的倍数)

ts0.c_cflag &= ~CSTOPB; //如果设置则使用两个停止位,如果取消则使用一个停止位

ts0.c_iflag |= IGNBRK; //如果设置,则忽略接收到的中断信号

ts0.c_lflag &= ~IEXTEN; //如果设置,则启用自定义输入处理

ts0.c_lflag |= NOFLSH; //如果设置,当SIGINT、SIGQUIT、SIGSUSP信号产生时,禁止刷新输入输出队列

开关(gytype)

{

情况 1:{rc = cfsetospeed(&ts0,B300);break; }

情况2:{rc = cfsetospeed(&ts0,B1200);break; }

情况3:{rc = cfsetospeed(&ts0,B9600);break; }

情况 4:{rc = cfsetospeed(&ts0,B9600);break; }

}

rc = tcsetattr(fd0,TCSAFLUSH,&ts0);

Linux嵌入式系统中,修改串口波特率不生效

如果是自己写的驱动,请先检查驱动是否支持

波特率

的修改。

如果支持:

stty -F /dev/ttyS0 speedcs8 -parenb -cstopb -echo 修改波特率提前衰减率 N 1

在下位机使用同样的配置,在Linux终端中输入echo “hello” > /dev/ttyS0,查看是否可以通信。

linux tcsetattr 的介绍到此结束。您找到您需要的信息了吗?如果您想了解更多相关信息,请记得添加书签并关注本网站。