前言
串口是一個非常強大的外設,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參考