UART
简介
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称作UART),是一种异步收发传输器,是电脑硬件的一部分,将资料由串行通信与并行通信间作传输转换。UART通常用在与其他通讯界面(如EIA RS-232 RS-422 RS-485)的连结上。
特性
- 异步:通信双方不需要时钟同步
- 双线:只有Tx和Rx两根数据线(不需要Clock线)
- 波特率:通信双方需要事前约定好相同的波特率
异步串口通信协议,工作原理是将传输数据的每个字符以串行方式一位接一位的传输。
工作模式
- UART数据图
- UART协议图
协议图中每一位数据的意义:
- 起始位:先发出一个逻辑”0”的信号,表示传输开始。
- 数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。传送方式LSB/MSB。
- 奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。
- 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
- 空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送。
- 波特率:是衡量数据传送速率的指针。表示每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位,则其传送的波特率为10×120=1200字符/秒=1200波特。
UART协议代码分析
开发环境
- 飞思卡尔FRDM-K64F开发板
- KDS3.2集成开发环境
- 飞思卡尔官方KSDK2.0开发库
- ubuntu16.04操作系统
代码实例
参考KSDK2.0 UART/interrupt例程设计,主程序如下:
UART_GetDefaultConfig(&uart_config);
uart_config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
uart_config.enableRx = true;
uart_config.enableTx = true;
UART_Init(DEMO_UART, &uart_config, CLOCK_GetFreq(DEMO_UART_CLK_SRC));
/* 使能接收溢出中断、接收中断、线路空闲中断 */
UART_EnableInterrupts(DEMO_UART, kUART_RxOverrunInterruptEnable | kUART_RxDataRegFullInterruptEnable | kUART_IdleLineInterruptEnable);
/* Interrupt handler */
void UART4_RX_TX_IRQHandler(void)
{
uint32_t status = UART_GetStatusFlags(DEMO_UART);
/* Receive data */
if (status & (kUART_RxDataRegFullFlag | kUART_RxOverrunFlag)) {
rx_buffer[receive_data_len] = UART_ReadByte(DEMO_UART);
receive_data_len++;
}
/* UART bus idle */
if (status & kUART_IdleLineFlag) {
is_receive_all = true;
uint8_t data = DEMO_UART->D;
}
}
问题分析
在串口接收数据的过程中,如何判断一帧数据?
frem-k64f单片机的uart模块,在中断选项中有idle(线路空闲)中断,该中断工作方式如下:
- 当一帧数据发送完成时IDLE Detection功能会从最后一个数据的STOP位开始检测,当检测到连续10或者13个高电平时,即表示没有start位过来了,即判断上一帧数据已经传输完毕,此时UART可以产生IDLE Line中断(即在整个传送过程中只有这一次中断),在此中断中可以置一个数据帧接收完成标志,然后在主程序可以对接收到的数据进行解包处理。