乐鑫esp8266的串口通讯驱动源文件,nonos和rtos版本
一、前言;
- 我们已经学习
esp8266
的方方面面都差不多了。貌似简单的串口通讯还没有提到,那么小徐精心准备下esp8266
串口通讯封装的过程。
二、esp8266
的串口分布情况;
①:
esp8266
有几个串口?
- 答:我们常见的
ESP8266-12f
有两个 UART,其中 UARTO 有 TX、RX,可做数据传输;UART1 由于 RX 脚被 SPI-Flash 占用,只能使用 TX,可以做串口调试信息打印。见下图:串口一是在GPIO2
,只可以查看信息。
②:
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
作为系统打印的端口,用来查看系统日志。【记得要公地】
四、esp8266
的NONOS
非系统,串口编程;
①:乐鑫给出的关于这个
NONOS
的串口文件其实都基本没什么修改的,参考来自网上大神,初始化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;
}
乐鑫esp8266的串口通讯驱动源文件,nonos和rtos版本的更多相关文章
- 乐鑫esp8266基于freeRtos实现私有服务器本地远程OTA升级
目录 一.前言: 二.回顾下OTA的流程: 三.lwip网络框架的知识的使用: 四.如何处理服务器返回的数据? 五.扇区的擦除和烧写? 六.如何调用? 七.好好享用吧! 八.下载: 九.工程截图: 代 ...
- 乐鑫esp8266的 基于Nonos移植红外线1883,实现遥控器控制
代码地址如下:http://www.demodashi.com/demo/12613.html 一.前言. 距离上篇的8266进阶博文有那么一段时间了,那么本文带来的是基于Nonos的红外线H1838 ...
- 实现乐鑫esp8266的无线OTA升级,实现远程在线升级固件
代码地址如下:http://www.demodashi.com/demo/12994.html 一.前言: 写了这么多的8266博文,一直以满意100%的心态去敲写代码固件烧录,以致很少出现 bug ...
- ESP8266乐鑫版本的(支持云端升级 (Boot 模式)烧写方法,(V1.5.4官方介绍如下)(BOOT模式)
硬件平台: nodeMCU devkit核心板,带ch340g,应该是仿造的,官方是cp2102驱动,安信可科技有连接https://wiki.ai-thinker.com/esp8266/board ...
- GeekPwn2015胸卡ESP8266 12E串口调试
相信今年参加GeekPwn活动的很多同学都获得了一枚GeekPwn的胸牌,为方便大家对胸牌进行一些调试和破解,这里分享一些关于这枚胸牌的一些信息 :)如发现文章之中有错误之处,欢迎大家斧正! 0×00 ...
- STM32F10x 学习笔记6(USART实现串口通讯 2)
这次讲讲利用串口收发中断来进行串口通讯.STM32 上为每个串口分配了一个中断.也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断.程序需在中断处理函数中读取状态寄存器(USART_SR) ...
- Android串口通讯
今天在整一个项目,需要利用串口通讯在网上看了好多人的帖子才稍微整出了一点头绪. 首先串口代码就是利用谷歌自己的api,将java代码放在java/android_serialport_api目录下,如 ...
- 树莓派中QT实现串口通讯
树莓派中QT实现串口通讯 开发平台为QT 此博客QT使用的为WiringPi驱动 我使用的串口调试助手为 cutecom 先简单说一些开发过程中需要注意的问题 Linux 下设备为 tty ,对应在 ...
- 串口(USART)通信-串口通讯协议简介
物理层:规定通讯系统中具有机械.电子功能部分的特性,确保原始数据在物理媒体的传输.其实就是硬件部分. 协议层:协议层主要规定通讯逻辑,统一收发双方的数据打包.解包标准.其实就是软件部分. 简单来说物理 ...
随机推荐
- Electron:将前端应用打包成桌面应用
首先戳我下载安装对应版本的node.js. 安装完成后,打开命令行输入node -v以及npm -v查看对应版本.能够正常显示说明安装成功. 写一个最简单的hello world的nodejs应用.n ...
- WebService数据示例
通过webservice提交xml数据以及soap协议的使用 上次已经给大家分享了简单的webservice的使用,提交给服务器的数据只是简单类型的数据,这次呢换成了xml,并通过一个小例子来讲解so ...
- 【最短路】【位运算】It's not a Bug, it's a Feature!
[Uva658] It's not a Bug, it's a Feature! 题目略 UVA658 Problem PDF上有 试题分析: 本题可以看到:有<=20个潜在的BUG,那 ...
- 如何ping测有端口的网站
参考:http://jingyan.baidu.com/article/c1a3101e878dcede656deb05.html 参考2:http://www.haoid.cn/post/261 现 ...
- sSkinProvider.pas
unit sSkinProvider;{$I sDefs.inc}{.$DEFINE LOGGED} interface uses Windows, Messages, SysUtils, Class ...
- file结构体中private_data指针的疑惑
转:http://www.360doc.com/content/12/0506/19/1299815_209093142.shtml hi all and barry, 最近在学习字符设备驱动,不太明 ...
- JAVA常见算法题(二十九)
package com.forezp.util; import java.util.Scanner; /** * 判断输入的5个字符串的最大长度,并输出 * * * @author Administr ...
- OpenShift应用镜像构建(1) S2I tomcat 镜像定制
参考并感谢https://www.jianshu.com/p/fd3e62263046 在对接项目制作应用镜像的过程中,经常发现避免不了的是需要写Dockerfile,(当然另外一种方式是直接run一 ...
- [转]Working with Parameters and Return Codes in the Execute SQL Task
本文转自:http://msdn.microsoft.com/zh-cn/magazine/cc280502(en-us,SQL.100).aspx SQL statements and stored ...
- (转)Android项目重构之路:实现篇
前两篇文章Android项目重构之路:架构篇和Android项目重构之路:界面篇已经讲了我的项目开始搭建时的架构设计和界面设计,这篇就讲讲具体怎么实现的,以实现最小化可用产品(MVP)的目标,用最简单 ...