注:无特别说明,以下内容符合ubuntu linux发行版

教程4: 串口设置

1. SYNOPSIS 总览

2. struct termios 结构体

最基本的设置串口包括波特率设置,效验位和停止位设置。

串口的设置主要是设置 struct termios 结构体的各成员值。

设置这个结构体很复杂,我这里就只说说常见的一些设置:

标准波特率设置

下面是修改波特率的代码:

设置波特率的例子函数:

效验位和停止位的设置:

无效验8位 Option.c_cflag &= ~PARENB;
Option.c_cflag &= ~CSTOPB;
Option.c_cflag &= ~CSIZE;
Option.c_cflag |= CS8;
奇效验(Odd)7位 Option.c_cflag |= ~PARENB;
Option.c_cflag &= ~PARODD;
Option.c_cflag &= ~CSTOPB;
Option.c_cflag &= ~CSIZE;
Option.c_cflag |= CS7;
偶效验(Even)7位 Option.c_cflag &= ~PARENB;
Option.c_cflag |= ~PARODD;
Option.c_cflag &= ~CSTOPB;
Option.c_cflag &= ~CSIZE;
Option.c_cflag |= CS7;
Space效验7位 Option.c_cflag &= ~PARENB;
Option.c_cflag &= ~CSTOPB;
Option.c_cflag &= &~CSIZE;
Option.c_cflag |= CS8;

设置效验的函数:

需要注意的是:

如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯,设置方式如下:

3. 非标准波特率

对于非标准的任意波特率需要用ioctl(fd, TIOCGSERIAL, p)和ioctl(fd, TIOCSSERIAL, p)的配合

ioctl的最后一个参数是struct serial_struct *类型,在Linux/serial.h中定义。其中baud_base是[基准晶振频率/16],通常baud_base=115200,需要设的是custom_divisor这个值,最终的波特率为baud_base/custom_divisor,比如你需要28800,因为115200/4=28800,所以要设置custom_divisor=4,。

具体过程为,先设置波特率设为38400(tcsetattr),然后用TIOCGSERIAL得到当前的设置,将flags设置ASYNC_SPD_CUST位,设置custom_divisor,最后用TIOCSSERIAL设置。

使用setserial其实就是利用上述方法,来设置baud_base, custom_divisor等, 其内部实现就是使用ioctl来进行设置。

另外还可以用硬件更换晶振,根据比例来达到使用一些非标准的波特率的目的。

但此方法只能设置ttyS*,如果是ttyUSB*则会报错,也就是USB转串口不能使用此方法

使用此方法的实例代码如下: 用法:只要指定serial_t的baud就可以了

4. LINUX下串口编程详细说明的官方资料

Serial Programming Guide for POSIX Operating Systems - 5th Edition, 6th Revision - Copyright 1994-2005 by Michael R. Sweet

5. 本课结束