前言
串口是一个非常强大的外设,ESP8266EX有两个UART分别是UART0和UART1,其中UART0可以正常通行,而UART1只支持数据发送功能。需要注意的是UART0在上电时会输出一些打印信息,如果想要禁用此功能需要在ESP8266上电期间将U0TXD、U0RXD与U0RTS、U0CTS交换(相关资料可查阅ESP8266官方手册)。
一、UART引脚介绍
串口名称 | 引脚功能 | 对应引脚 |
---|
UART0 | TXD | GPIO_Pin_26 |
- | RXD | GPIO_Pin_25 |
- | CTS | GPIO_Pin_12 |
- | RTS | GPIO_Pin_13 |
UART1 | TXD | GPIO_Pin_14 |
二、UART介绍
ESP8266的UART0和UART1各有一个长度为128Byte的FIFO,读写FIFO时在同一个地址操作。
发送FIFO的基本工作过程:
只要有数据填充到发送FIFO里,就会立即启动发送过程。甶于发送本身是个相对缓慢的过程,因此在发送的同时其它需要发送的数据还可以继续填充到发送FIFO里。当发送FIFO被填满时就不能再继续填充了,否则会造成数据丢失,此时只能等待。发送FIFO会按照填入数据的先后顺序把数据一个个发送出去,直到发送FIFO全空时为止。已发送完毕的数据会被自动清除,在发送FIFO里同时会多出一个空位。
接收FIFO的基本工作过程:
当硬件逻辑接收到数据时,就会往接收FIFO里填充接收到的数据。程序应当及时取走这些数据,数据被取走也是在接收FIFO里被自动删除的过程,因此在接收FIFO里同时会多出一个空位。如果在接收FIFO里的数据未被及时取走而造成接收FIFO已满,则以后再接收到数据时因无空位可以填充而造成数据丢失。
2.1 UART初始化操作
功能介绍 | 双UART模式,初始化两个UART的波特率 | - |
---|
函数原型 | void uart_init(UartBautRate uart0_br,UartBautRate uart1_br); | - |
参数介绍 | uart0_br | UART0的波特率 |
- | uart1_br | UART1的波特率 |
参数枚举 | BIT_RATE_9600 | 9600bps |
- | BIT_RATE_19200 | 19200bps |
- | BIT_RATE_38400 | 38400bps |
- | BIT_RATE_57600 | 57600bps |
- | BIT_RATE_74800 | 74800bps |
- | BIT_RATE_115200 | 115200bps |
- | BIT_RATE_230400 | 230400bps |
- | BIT_RATE_460800 | 460800bps |
- | BIT_RATE_921600 | 921600bps |
示例 | uart_init(BIT_RATE_9600, BIT_RATE_9600); | 配置UART0的波特率为9600bps,UART1的波特率为9600bps |
2.2 UART0发送字符串函数
功能介绍 | UART0发送字符串函数 | - |
---|
函数原型 | void uart0_sendStr(const char *str); | - |
参数介绍 | *str | 发送的字符串 |
示例 | uart0_sendStr(“Hello World! \r\n”); | UART0发送字符串 |
2.3 UART0发送数据
功能介绍 | UART0发送数据 | - |
---|
函数原型 | void uart0_tx_buffer(uint8 *buf, uint16 len); | - |
参数介绍 | *buf | 发送的数据缓冲区 |
- | len | 发送的数据长度 |
2.4 UART接收中断使能函数
功能介绍 | UART接收中断使能函数 | - |
---|
函数原型 | void uart_rx_intr_enable(uint8 uart_no); | - |
参数介绍 | uart_no | 使能接收中断的UART端口 |
参数枚举 | uart0 | - |
- | uart1 | - |
2.5 UART接收中断禁用函数
功能介绍 | UART接收中断禁用函数 | - |
---|
函数原型 | void uart_rx_intr_disable(uint8 uart_no); | - |
参数介绍 | uart_no | 禁用能接收中断的UART端口(前面有介绍) |
2.6 UART的参数配置
2.6.1 UART波特率配置
功能介绍 | 设置UART的波特率 | - |
---|
函数原型 | void UART_SetBaudrate(uint8 uart_no,uint32 baud_rate); | - |
参数介绍 | uart_no | 需要设置的UART端口(前面有介绍) |
- | baud_rate | 设置的波特率(波特率可设置的范围为300bps-4608Kbps)) |
2.6.2 UART校验模式配置
功能介绍 | 设置UART的校验模式 | - |
---|
函数原型 | void UART_SetParity(uint8 uart_no, UartParityMode Parity_mode); | - |
参数介绍 | uart_no | 需要设置的UART端口(前面有介绍) |
- | Parity_mode | 设置UART的校验模式 |
参数枚举 | NONE_BITS(0x02) | 无校验 |
- | ODD_BITS(0x01) | 奇校验 |
- | EVEN_BITS(0x00) | 偶校验 |
2.6.3 UART数据字长设置
功能介绍 | UART数据字长设置 | - |
---|
函数原型 | void UART_SetWordLength(uint8 uart_no, UartBitsNum4Char len); | - |
参数介绍 | uart_no | 需要设置的UART端口(前面有介绍) |
- | len | 设置UART的数据字长 |
参数枚举 | FIVE_BITS(0x00) | 5位字长 |
- | SIX_BITS(0x01) | 6位字长 |
- | SEVEN_BITS(0x02) | 7位字长 |
- | EIGHT_BITS(0x03) | 8位字长 |
2.6.4 UART停止位设置
功能介绍 | UART停止位设置 | - |
---|
函数原型 | void UART_SetStopBits(uint8 uart_no, UartStopBitsNum bit_num); | - |
参数介绍 | uart_no | 需要设置的UART端口(前面有介绍) |
- | len | UART的停止位 |
参数枚举 | ONE_STOP_BIT(0x01) | 1个停止位 |
- | ONE_HALF_STOP_BIT(0x02) | 1.5个停止位 |
- | TWO_STOP_BIT(0x03) | 2个停止位 |
2.6.4 切换系统默认打印端口
功能介绍 | 切换系统默认打印端口 | - |
---|
函数原型 | void UART_SetPrintPort(uint8 uart_no); | - |
参数介绍 | uart_no | 需要切换的UART端口(前面有介绍) |
三、示例
#include "ets_sys.h"
#include "osapi.h"
#include "user_interface.h"
#include "uart.h"
static os_timer_t os_timer;
void ESP8266_UART0_Init( void )
{
/** 初始化串口 设置串口的波特率为9600 */
uart_init( BIT_RATE_9600, BIT_RATE_9600 );
/** 配置串口每500ms发送一次数据 */
os_timer_disarm( &os_timer );
os_timer_setfn( &os_timer, (os_timer_func_t *) ( uart0_sendStr ),
"Hello World!\r\n" );
os_timer_arm( &os_timer, 500, 1 );
}
void user_init( void )
{
ESP8266_UART0_Init();
}
参考资料
[1]. ESP8266技术参考
[2]. ESP8266Non-OS SDK API参考