问题背景:
使用乐鑫的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 ", data); // 主动发送数组到串口 uart_write_bytes(UART_NUM_0, (const char *)data, len); }
这个完成以后,你就可以做一个测试了。本人测试是可以的。有啥问题欢迎沟通讨论。
总结反思:
技术的问题,特别是不熟悉的平台,花时间去打磨是必须的。