Linux串口设置

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;
}






Linux 系统中配置串口使用非标准波特率,通常需要通过终端接口(termios)进行设置。标准波特率(如 9600、115200)可以通过 `termios` 提供的常量(如 `B9600`、`B115200`)直接设置,而非标准波特率则需要使用 `cfsetospeed` 和 `cfsetispeed` 函数,并结合 `CBAUD` 掩码和 `BOTHER` 标志来实现。 以下是一个配置非标准波特率的示例流程: ### 1. 打开串口设备 使用 `open()` 函数打开串口设备文件,例如 `/dev/ttyS0` 或 `/dev/ttyUSB0`: ```c #include <fcntl.h> #include <unistd.h> #include <termios.h> int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { // 处理错误 } ``` ### 2. 获取当前终端属性 使用 `tcgetattr()` 获取当前串口的配置: ```c struct termios options; tcgetattr(fd, &options); ``` ### 3. 设置非标准波特率 使用 `cfsetospeed` 和 `cfsetispeed` 设置输入和输出波特率。对于非标准波特率,需将波特率掩码设置为 `BOTHER`,并直接指定所需的波特率值: ```c cfsetispeed(&options, BOTHER); cfsetospeed(&options, BOTHER); // 设置自定义波特率,例如 123456 options.c_cflag &= ~CBAUD; options.c_cflag |= BOTHER; options.c_ispeed = 123456; options.c_ospeed = 123456; ``` ### 4. 应用新的串口设置 使用 `tcsetattr()` 将新的配置应用到串口设备: ```c tcsetattr(fd, TCSANOW, &options); ``` ### 5. 验证设置 可以使用 `ioctl()` 获取当前波特率设置,以验证是否成功: ```c struct serial_struct ser; if (ioctl(fd, TIOCGSERIAL, &ser) == 0) { printf("Current baud rate: %d\n", ser.custom_divisor); } ``` ### 注意事项 - 某些串口驱动程序可能不支持非标准波特率,尤其是基于 USB 的串口适配器。 - 内核缓冲区大小和 I/O 模式(阻塞或非阻塞)可能会影响数据传输性能。如果波特率设置过高,可能会导致缓冲区溢出或写操作失败(如错误码 `EAGAIN`)[^2]。 - 在使用非标准波特率时,确保连接的设备也支持相同的波特率设置,否则通信将失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值