在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函数时,需要了解该函数的参数及其用法,并需要进行错误处理,以保证程序的健壮性。
相关问题延伸阅读:
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);
如果是自己写的驱动,请先检查驱动是否支持
波特率
的修改。
如果支持:
stty -F /dev/ttyS0 speedcs8 -parenb -cstopb -echo 修改波特率提前衰减率 N 1
在下位机使用同样的配置,在Linux终端中输入echo “hello” > /dev/ttyS0,查看是否可以通信。
linux tcsetattr 的介绍到此结束。您找到您需要的信息了吗?如果您想了解更多相关信息,请记得添加书签并关注本网站。