串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。
数据格式;一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求。
每一个字符的前面都有一位起始位(低电平),字符本身由7位数据位组成,接着字符后面是一位校验位(检验位可以是奇校验、偶校验或无校验位),最后是一位或一位半或二位停止位,停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。实际传输时每一位的信号宽度与波特率有关,波特率越高,宽度越小,在进行传输之前,双方一定要使用同一个波特率设置。
平常使用类似STM32这种平台使用串口一般是用来做调试或者外接一些模块比如:蓝牙、超声波等等,同样ESP8266针对串口这块提供的接口也是特别多,本文只针对主要的几个关键函数进行解析;
头文件
#include "driver/uart.h"
SDK中提供的接口与STM32的串口配置大同小异,无外乎就是配置串口的波特率、数据位、停止位、奇偶校验位等等,再者就还有串口中断配置如接收中断、发送中断、超时中断等等。
串口配置结构体
typedef struct {
int baud_rate; /*!< 串口波特率 */
uart_word_length_t data_bits; /*!< 字长(数据位)*/
uart_parity_t parity; /*!< 奇偶校验位 */
uart_stop_bits_t stop_bits; /*!< 停止位 */
uart_hw_flowcontrol_t flow_ctrl; /*!< UART硬件流控制模式(cts / rts) */
uint8_t rx_flow_ctrl_thresh; /*!< 设置串口RTS阈值 */
} uart_config_t;
简单的使用起来就两个步骤:
串口相关参数的配置 安装UART驱动程序通过以上两步就可以通过串口进行读写了;
串口相关参数配置当我们创建一个uart_config_t uart_config的结构体进行配置后,只需要调用一个函数即可完成配置;
UART参数配置函数
*esp_err_t uart_param_config(uart_port_t uart_num, uart_config_t uart_conf)
参数 | 解析 |
---|---|
uart_num | 要配置的Uart号 |
uart_conf | uart_config_t结构体 |
函数原型如下:
esp_err_t uart_param_config(uart_port_t uart_num, uart_config_t *uart_conf)
{
UART_CHECK((uart_num flow_ctrl & UART_HW_FLOWCTRL_RTS) {
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_U0RTS);
}
if (uart_conf->flow_ctrl & UART_HW_FLOWCTRL_CTS) {
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_UART0_CTS);
}
uart_set_hw_flow_ctrl(uart_num, uart_conf->flow_ctrl, uart_conf->rx_flow_ctrl_thresh);
}
uart_set_baudrate(uart_num, uart_conf->baud_rate); //波特率
uart_set_word_length(uart_num, uart_conf->data_bits); //字长
uart_set_stop_bits(uart_num, uart_conf->stop_bits); //停止位
uart_set_parity(uart_num, uart_conf->parity); //奇偶校验位
uart_reset_rx_fifo(uart_num);
return ESP_OK;
}
不难看出,该函数调用了单独配置给各种参数的接口,算是一个串口配置的结合函数,使用起来十分方便,但是如果想要对单独的某个设置进行配置的话,也可以使用对应的接口去配置。
安装UART驱动程序类似于GPIO配置中开启GPIO中断一样,中断服务需要通过一个函数来进行安装,串口在配置完成后,也需要进行串口服务安装,调用以下函数。
esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_buffer_size, int queue_size, QueueHandle_t *uart_queue);
参数 | 解析 |
---|---|
uart_num | Uart端口号 |
rx_buffer_size | UART 接收缓冲区的大小 |
tx_buffer_size | UART 发送缓冲区的大小。如果设置为零,驱动程序将不使用TX缓冲区,TX函数将阻塞任务,直到所有数据都已发送出去,即需要发送完后才能执行别的工作 |
queue_size | UART事件队列的大小/深度 |
uart_queue | UART事件队列句柄(输出参数)。如果成功,这里将写入一个新的队列句柄来提供对UART事件的访问。如果设置为NULL,驱动程序将不使用事件队列。 |
用例:实现蓝牙接收并打印(这里用的蓝牙4.0波特率是9600,所以为了避免看到乱码,需要在make menuconfig中设置monitor的波特率为9600)
#include
#include
#include
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
static const char *TAG = "bluetooth test";
static void ble_task(void *arg)
{
uart_config_t uart_config = {
.baud_rate = 9600, //蓝牙波特率
.data_bits = UART_DATA_8_BITS, //8位数据位
.parity = UART_PARITY_DISABLE, //无奇偶校验
.stop_bits = UART_STOP_BITS_1, //1位停止位
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE //无硬件流
};
uart_param_config(UART_NUM_0, &uart_config); //配置初始化
uart_driver_install(UART_NUM_0, 1024 * 2, 0, 0, NULL); //安装串口驱动
uint8_t *pBuff = (uint8_t *) malloc(1024);
while (1) {
memset(pBuff, 0, 1024);
int len = uart_read_bytes(UART_NUM_0, pBuff, 1024, 20 / portTICK_RATE_MS);
if(len > 0)
ESP_LOGI(TAG, "pBuff : %s\n", pBuff);
}
}
void app_main(void)
{
xTaskCreate(ble_task, "uart_ble_task", 1024, NULL, 10, NULL);
}
结果:
说明:官方提供的UART的接口可不止这里介绍的这点,详见头文件下的接口说明,这类博文只是快速拉一遍ESP8266的基础学习而已,要深入了解还是去看看官方提供的接口,这里讲不完太多了。
我的GITHUB
我的个人博客
CSDN