基于Linux的tty架构及UART驱动详解
发布网友
发布时间:2024-10-24 05:26
我来回答
共1个回答
热心网友
时间:2024-10-28 04:45
通用异步收发传输器(UART)是嵌入式设备中的关键组件,它在串行通信与并行通信之间转换数据。UART是一种异步串口通信协议,用于主机与辅助设备之间的双向通信。在嵌入式设备中,UART广泛用于与PC机通信,如监控调试器、外部设备等,还包括与汽车音频系统和外接AP之间的连接。UART的通信协议将传输数据的每个字符以位为单位进行顺序传输,其中包括停止位以供计算机校正时钟同步。
波特率是衡量数据传输速率的指标,它表示每秒传输的符号数。波特率与数据的阶数有关,阶数越高,数据传输速率越慢,但同步的容忍程度越大。UART接收和发送数据按照相同的波特率进行,波特率发生器产生的时钟频率为波特率的16倍,用于在接收时进行精确采样,确保数据传输的正确性。
UART的工作原理分为发送和接收过程。发送数据时,从空闲状态开始,拉低线路发送数据位,接着发送奇偶检验位和停止位。接收数据时,从空闲状态开始,检测数据下降沿,按约定的波特率接收数据位,并在接收奇偶检验位后比较其正确性。
UART的接收数据时序包括:检测数据下降沿,计数器开始计数;计数器为8时,采样值为开始位;计数器为24时,采样值为bit0数据;计数器为40时,采样值为bit1数据;以此类推,直至完成一帧数据的收发。
RS232与RS485是两种电气协议,用于定义数据传输的电气特性与物理特性。UART协议则定义了数据帧格式和波特率等。RS232使用3-15V的电压信号,而UART通常使用CPU的TTL电平(0-3.3V)。RS232允许单线全双工传输,而RS485需要使用两根线实现全双工。
流控制是解决数据传输中出现的丢失数据问题或处理速度不同情况的机制。硬件流控如RTS/CTS和DTR/DSR通过信号控制数据传输,而软件流控如XON/XOFF通过控制字符实现数据传输的暂停与恢复。
在Linux系统中,TTY驱动程序框架用于管理终端设备。TTY设备包括串口终端(/dev/ttyS*)、控制台终端(/dev/console)和虚拟终端(/dev/tty*)。TTY架构分为下层串口驱动和上层TTY层,实现数据的发送和接收。关键数据结构如struct uart_driver、struct console、struct uart_state和struct uart_port封装了串口驱动的逻辑和操作。数据收发流程包括打开设备、发送数据、接收数据、关闭设备和注销流程。对于RS485通信,需考虑电压和信号的转换,以及使用不同的模式实现全双工或半双工通信。
UART驱动的注册和操作涉及到uart_register_driver、uart_unregister_driver、uart_add_one_port、uart_remove_one_port等关键函数接口。串口编程时,需要使用相应的控制函数进行配置和操作,如设置偶校验。此外,提供了一个测温模块收取数据的示例程序。