你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
首页
热门
推荐
精选
登录
|
注册
乐鑫esp8266的串口通讯驱动源文件,nonos和rtos版本
立即下载
用AI写一个
金额:
10
元
支付方式:
友情提醒:源码购买后不支持退换货
立即支付
发布时间:2019-04-02
119人
|
浏览:7362次
|
收藏
|
分享
技术:C语言
运行环境:乐鑫Linux镜像+编译链
概述
乐鑫esp8266的 SDK编程 串口通讯驱动源文件,包括nonos和rtos版本。适合与其他单片机串口通讯。
详细
[TOC] ### 一、前言; ----- - 我们已经学习`esp8266`的方方面面都差不多了。貌似简单的串口通讯还没有提到,那么小徐精心准备下`esp8266`串口通讯封装的过程。 ------------------ ### 二、`esp8266`的串口分布情况; --------------- > ①:`esp8266`有几个串口? - 答:我们常见的` ESP8266-12f` 有两个 UART,其中 UARTO 有 TX、RX,可做数据传输;UART1 由于 RX 脚被 SPI-Flash 占用,只能使用 TX,可以做串口调试信息打印。见下图:串口一是在`GPIO2`,只可以查看信息。 ![](/contentImages/image/20180723/kiNCQQPXFtGD3RyWKTh.png) ------------------------- > ②:`esp8266`如何屏蔽上电打印?? - 答:不管什么情况,U0TXD默认上电有系统打印,对此敏感应用可通过UART的内部引脚交换功能,在初始化的时候,调用system_uart_swap函数。将`txd`和`rxd` 分别于U0RTS(MTDO/GPIO15)、U0CTS (MTCK/GPIO13)交换来屏蔽该上电的系统打印。 交换后,硬件上的下载管脚还是使用U0TXD + U0RXD,通信时需要将MTDO对应接到MCU的RXD,MTCK对应加到MCU的TXD。 ------------------ ### 三、`esp8266`的串口通讯时候,应该怎么接线; ------------------ - 如下图所示,短脚`txd`和`rxd`作为和单片机通讯的端脚,而`gpio2`作为系统打印的端口,用来查看系统日志。
**【记得要公地】** ![](/contentImages/image/20180723/tCP42KX87bxdX65WyLs.png) ------------------ ### 四、`esp8266`的`NONOS`非系统,串口编程; ------------------ - ①:乐鑫给出的关于这个`NONOS`的串口文件其实都基本没什么修改的,参考来自[网上大神](https://blog.csdn.net/chen244798611/article/details/51470630),初始化`uart_init()`方法,里面的第一个是串口0的波特率,第二个是串口一的波特率设置。 - ②:然后通过接受数据,发生中断,进入到中断回调函数`uart0_rx_intr_handler()`,如下代码: ``` LOCAL void uart0_rx_intr_handler(void *para) { int fifo_len; //1 接收中断禁用,用于不再接受数据,因为现在处于处理数据中 uart_rx_intr_disable(UART0); //2 清楚中断标志 WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR); CLEAR_PERI_REG_MASK(UART_INT_ENA(UART0), UART_TXFIFO_EMPTY_INT_ENA); //3 从 FIFO 读取接收到的数据长度 fifo_len = (READ_PERI_REG(UART_STATUS(UART0)) >> UART_RXFIFO_CNT_S) & UART_RXFIFO_CNT; uint8 d_tmp = 0; uint8 idx = 0; //定义一个临时接收的数据 uint8 recieveData[fifo_len]; //3. 赋值给临时数组 for (idx = 0; idx < fifo_len; idx++) { d_tmp = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF; //根据数据长度一个一个读取数据 recieveData[idx] = d_tmp; //赋值 } //做你自己的事情,recieveData[]数组就是接收到单片机的数据 //4 计数使能中断 UART0 WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR | UART_RXFIFO_TOUT_INT_CLR); uart_rx_intr_enable(UART0); } ``` ------------------ ### 五、`esp8266`的`RTOS`实时系统,串口编程; ------------------ - ①:`RTOS`实时系统的比`NONOS`的稍微复杂丢丢,实现的原理和过程也是一样的,通过中断,但是代码不一样,初始化配置如下: ``` void uart_init_new(void) { UART_WaitTxFifoEmpty(UART0); UART_WaitTxFifoEmpty(UART1); //下位机通讯串口设置:串口0 UART_ConfigTypeDef uart_config; uart_config.baud_rate = BIT_RATE_9600; //波特率为9600 uart_config.data_bits = UART_WordLength_8b; uart_config.parity = USART_Parity_None; uart_config.stop_bits = USART_StopBits_1; uart_config.flow_ctrl = USART_HardwareFlowControl_None; uart_config.UART_RxFlowThresh = 120; uart_config.UART_InverseMask = UART_None_Inverse; UART_ParamConfig(UART0, &uart_config); //日志打印 串口一 uart_config.baud_rate = BIT_RATE_74880;//波特率为74880 UART_ParamConfig(UART1, &uart_config); UART_IntrConfTypeDef uart_intr; uart_intr.UART_IntrEnMask = UART_RXFIFO_TOUT_INT_ENA | UART_FRM_ERR_INT_ENA | UART_RXFIFO_FULL_INT_ENA | UART_TXFIFO_EMPTY_INT_ENA; uart_intr.UART_RX_FifoFullIntrThresh = 100; uart_intr.UART_RX_TimeOutIntrThresh = 10; uart_intr.UART_TX_FifoEmptyIntrThresh = 20; UART_IntrConfig(UART0, &uart_intr); UART_SetPrintPort(UART1); UART_intr_handler_register(uart0_rx_intr_handler, NULL); ETS_UART_INTR_ENABLE(); } ``` - ②:数据中断处理函数: ``` void ICACHE_FLASH_ATTR PutUartDataToQueueFromISR(void) { portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; uint16 fifo_len = 0; uint16 buf_idx = 0; uint8* uart_fifo = NULL; fifo_len = (READ_PERI_REG(UART_STATUS(UART0)) >> UART_RXFIFO_CNT_S) & UART_RXFIFO_CNT; uint8 d_tmp = 0; uint8 idx = 0; uint8 recievHex[fifo_len]; int i; for (idx = 0; idx < fifo_len; idx++) { d_tmp = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF; recievHex[idx] = d_tmp; } //做你自己的事情,recievHex[]数组就是接收到单片机的数据 } ``` -------------------------- ### 六、开始封装串口编程成一个函数; ----------------- > 下面的过程都是适用`NONOS`和`RTOS`的; ---------------- #### 1、写注册回调函数和注册回调函数; ---------------- - 封装的意义和目的在于怎么把代码降低耦合,我这依然用回调方法的思想封装,首先要写一个回调函数的格式,毕竟都是传数组的,所以也就这样写吧! ``` //声明方法 typedef void (*Recv_Uart_Callback)(uint8* pData_buf, uint16 data_len); //注册回调函数 void funUart_ReadBack_Register(Recv_Uart_Callback callBack); ``` -------------------- #### 2、源文件调用; - 首先在全局变量声明下,然后通过赋值,后面调用即可。 ``` Recv_Uart_Callback callBack; void funUart_ReadBack_Register(Recv_Uart_Callback tempCallBack) { callBack = tempCallBack; } ``` - 在串口中断回调函数调用: ``` //做你自己的事情,recieveData[]数组就是接收到单片机的数据 callBack(recieveData,fifo_len); ``` -------------------- #### 3、如何调用? > 好吧!调用起来非常简单! ` Let us see !` ---------- - 下面是`NONOS`代码示范: ``` //串口回调 void redCallBackFun(uint8* pData_buf, uint16 data_len) { int i; for (i = 0; i < data_len; i++) uart_tx_one_char(UART0, *(pData_buf + i)); //原路返回 } void user_init(){ uart_init(9600, 9600); funUart_ReadBack_Register(redCallBackFun); } ``` ----------- - 下面是`rtos`代码示范: ``` void funUartCallBack(uint8* pData_buf, uint16 data_len) { int i; UART0_Send_Hex(pData_buf, data_len); //原路返回 for (i = 0; i < data_len; i++) { printf("pData_buf[%d]:%d\n", i, *(pData_buf + i)); //打印到串口一 } } void Task_Uart_Communi(){ Uart_CallBack_Register(funUartCallBack); uart_init_new(); while(1){}; } void user_init(void) { xTaskCreate(Task_Uart_Communi, "Task_Uart_Communi", 512, NULL, 2, NULL); os_printf("\n SDK version:%s \n", system_get_sdk_version()); } ``` -------------------------- ### 七、看看打印的效果; ----------------- ![](/contentImages/image/20180723/BCv4qFiFBwEirV4oTSR.png) -------------------------- ### 八、下载与集成; ----------------- - 添加到您的现有工程中,注意要去掉自带的`uart.h`和`uart.c`文件,毕竟会造成冲突!如果`rots`编译发现缺少`UART_RXD_INV`,那么请手动添加`uart_register.h`文件! - 最后,共勉成果! -------------------------- ### 九、工程架构; -------------------------- ![](/contentImages/image/20180723/sLDCofeikO28VR3b28l.png)
本实例支付的费用只是购买源码的费用,如有疑问欢迎在文末留言交流,如需作者在线代码指导、定制等,在作者开启付费服务后,可以点击“购买服务”进行实时联系,请知悉,谢谢
感谢
9
手机上随时阅读、收藏该文章 ?请扫下方二维码
相似例子推荐
评论
作者
半颗心脏
13
例子数量
740
帮助
127
感谢
评分详细
可运行:
4.5
分
代码质量:
4.5
分
文章描述详细:
4.5
分
代码注释:
4.5
分
综合:
4.5
分
作者例子
基于Android的rgb七彩环颜色采集器
企业者的福音之8266接入阿里智能,点亮一盏灯。
乐鑫esp8266的 基于Nonos移植红外线1883,实现遥控器控制
Android开发SDK接入机智云,智能家居实现APP远程控制多设备
实现乐鑫esp8266的无线OTA升级,实现远程在线升级固件。
乐鑫esp8266基于freeRtos实现私有服务器本地远程OTA升级
乐鑫esp8266的串口通讯驱动源文件,nonos和rtos版本
esp8266烧录Html文件,实现内置网页控制设备!
动起来做一个微信小程序Mqtt协议控制智能硬件的框架,支持短线重连!
乐鑫esp8266使用 SPI 驱动Max7219芯片的驱八位数码管!
在支付宝小程序上websocket实现mqtt协议连接服务器控制硬件。
乐鑫esp32 sdk编程驱动ws2812灯珠,实现彩虹光彩夺目效果。
微信小程序ble蓝牙控制esp32,实现无需网络也可以控制亮度;