乐鑫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)通信-串口通讯协议简介
物理层:规定通讯系统中具有机械.电子功能部分的特性,确保原始数据在物理媒体的传输.其实就是硬件部分. 协议层:协议层主要规定通讯逻辑,统一收发双方的数据打包.解包标准.其实就是软件部分. 简单来说物理 ...
随机推荐
- python datetime处理时间(转)
Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.time模块,它提供 的接口与C标准库time.h基本一致.相比于time模块,datetime模块的接 ...
- 将json字符串转换成list<T>
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Se ...
- [转]MySql中创建序列的方法
CREATE TABLE `my_seq` ( `seq` int(10) NOT NULL default 10000) ENGINE=MyISAM DEFAULT CHARSET=utf8 ...
- 技术分享:杂谈如何绕过WAF(Web应用防火墙)(转)
0×01开场白 这个议题呢,主要是教大家一个思路,而不是把现成准备好的代码放给大家. 可能在大家眼中WAF(Web应用防火墙)就是"不要脸"的代名词.如果没有他,我们的" ...
- 关于Android架构那些事
刚开始,因为业务比较赶,我们也没有进行比较好的顶层设计,对代码的要求也是最低要求——完成功能开发就行了.这种短期设计也就造成了我们代码的扩展性几乎为零,稍微添加一点新功能,都要大动干戈.在后台系统架构 ...
- Tex系列: pgfplots安装
(1) 上网下载最新宏包压缩包 http://sourceforge.net/projects/pgfplots/files/pgfplots/ (2)解压压缩包,把该包下的tex子目录拷贝至D:\ ...
- 【FireMonkey】StyleBook使用方法
近期在开发一个团队文档管理工具,使用Embarcadero的XE2-C++builder进行界面开发,使用Firemonkey框架. 而这个框架十分有趣!可能吸引界面开发者的就是这个StyleBook ...
- [S5PV210 Linux字符驱动之PWM蜂鸣器驱动
在SMDK210.C中添加如下beeper_device 结构体 static struct platform_device beeper_device = { .name = "pwm_b ...
- 【Linux】Shell三类变量的作用域——linux shell “永久环境变量”、“临时环境变量”和"普通变量"之完全解读
2015-05-08 00:15 3896人阅读 评论(10) 收藏 举报 本文章已收录于: 分类: 软件开发进阶(419) 作者同类文章X Unix/Linux杂项(118) 作者同类文章X ...
- 【笔记】探索js 的this 对象 (第二部分)
了解this 对象之后 我们明白了this 对象就是指向调用函数的作用域 那么接下来我们便要清除函数究竟在哪个作用域调用 找到调用的作用域首先要了解一下几点: 1.调用栈: 调用栈就是一系列的函数,表 ...