问题背景:

  使用乐鑫的ESP8266做一个物联网的项目,要使用串口0通信,串口1作为打印log。本来是一个非常简单的事情。没想到居然里面有个大坑。本着前任踩坑,后任抱娃的原则。

这里就做个记录,给后面的同仁做一个前车之鉴吧。

   

  调研分析:

  其实,这个关于串口打印及通信的,网上的资料很多,乐鑫官方文档的资料也很多。我尝试用他们的方法去用的时候,怎么都不行。后来才发现,是我用的是新版本。

它的新版本有些库函数都做了优化了。已经不存以前的那些串口接口了,这样就导致了他们的那些配置软件串口的方法根本行不通了。

  新的SDK,底层函数变了,导致配置全都和以前不一样的,下面是新的串口配置流程:

   使用串口1打印:

如果SDK版本是 v3.1 的话,可以直接在 make menuconfig 面板里面直接配置:

    

Component config --->
ESP8266-specific --->
UART for console output (Custom) --->
UART peripheral to use for console output (0-1) (UART1) --->

  在 v3.0 版本配置项可能有些出入,但是大致类似。或者使用下面代码:
    

PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);
uart_param_config(UART_NUM_1, &uart_config);
uart_driver_install(UART_NUM_1, 0, BUF_SIZE + 1, BUF_SIZE + 1, NULL)

       串口0的通信配置:

  

uart_config_t uart_config = {
.baud_rate = 9600, //波特率
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE};

uart_param_config(UART_NUM_0, &uart_config);
uart_driver_install(UART_NUM_0, BUF_SIZE * 2, 0, 0, NULL);

// 为收到的数组数字开辟一个内存
uint8_t *data = (uint8_t *)malloc(BUF_SIZE);

while (1)
{
// 读取串口数组
int len = uart_read_bytes(UART_NUM_0, data, BUF_SIZE, 20 / portTICK_RATE_MS);

//打印下数组

printf("uart_read_bytes data[%d]= %s \n ", data);

// 主动发送数组到串口
uart_write_bytes(UART_NUM_0, (const char *)data, len);
}

  这个完成以后,你就可以做一个测试了。本人测试是可以的。有啥问题欢迎沟通讨论。 

  总结反思:

  技术的问题,特别是不熟悉的平台,花时间去打磨是必须的。  

 

01-12 16:27