串口即串行接口(serial port)
标准串口协议支持的最高数据传输率为115kbps
硬件流量控制(RTS/CTS和DTR/CTS)
RTS/CTS:
当接收端数据超过缓冲区高位标志后,串口控制器把CTS信号线设置为低电平,表示停止数据发送;
当接收端数据缓冲区处理到低位以下,串口控制器设置CTS为高电平,表示可以开始数据发送。数据接收端RTS信号表示是否准备好接收数据。
软件流量控制(XON/OFF)
XON/OFF:
当接收端数据流量超过高位时,接收端向发送端发出XOFF字符(通常为十进制19),表示停止数据发送;
当接收端数据缓冲数据低于低位时,接收端向发送端发出XOFF字符(通常为十进制17)表示开始数据传输。
串口操作与文件操作相似,可以使用open、close
等函数来打开关闭串口。使用select()
函数监听串口。串口是个硬件设备可以设置串口属性。
Linux中通常使用termios
结构存储串口参数
Struct termios{
unsigned short c_iflag; /* 输入模式标志*/
unsigned short c_oflag; /* 输出模式标志*/
unsigned short c_cflag; /* 控制模式标志*/
unsigned short c_lflag; /*区域模式标志或本地模式标志或局部模式*/
unsigned char c_line; /*线路控制规则*/
unsigned char c_cc[NCC]; /* 控制字符特性*/
}
termios.h
头文件为termios结构提供了一组设置的函数:
tcgetattr(int fd, struct termios *termios_p)
函数用于读取串口参数设置;
tcsetattr(int fd, int optional_actions, const struct termios *termios_p)
函数用于设置串口参数;
tcsendbreak(int fd, int duration);
函数 传送连续0值的比特流,持续一段时间;
tcdrain(int fd);
函数 等待直到所有写入fd引用对象的输出都被传输;
tcflush(int fd, int queue_selector);
函数 丢弃要写入引用的对象但是尚未传输的数据,或者收到但是尚未读取的数据,取决于参数queue_selector的值;
tcflow(int fd, int action);
函数 挂起fd引用对象上的数据传输或接收,取决于action值;
cfmakeraw(struct termios *termios_p);
函数 设置终端属性为原始数据方式,相当于对于参数termios_p配置;
speed_t cfgetispeed(const struct termios *termios_p);
speed_t cfgetospeed(const struct termios *termios_p);
用于得到串口输入和输出速率;
int cfsetispeed(struct termios *termios_p, speed_t speed);
int cfsetospeed(struct termios *termios_p, speed_t speed);
用于设置串口输入和输出速率;
Ioctl系统调用用来控制RTS和获得DTS等串口引脚的状态。
串口编程大致流程:
1. 打开串口设备open;
2. 取得当前串口配置tcgetattr();
3. 设置波特率cfsetispeed()、cfsetospeed();
4. 设置数据位;
5. 设置奇偶校验位;
6. 设置停止位;
7. 设置超时时间;
8. 设置写入的设备;
9. 读取数据直到接收到结束标志;
10. 关闭串口 close();
串口相关概念:
串口相关的概念解析