Linux 下串口编程(个人笔记)

串口即串行接口(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()

串口相关概念:
串口相关的概念解析

你可能感兴趣的:(Linux)