乐鑫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版
# 有多组输入数据,但没有具体的告诉你有多少组,只是让你对应每组输入,应该怎样输出. while True: try: a, b = map(int, raw_input().strip().spli ...
- 【BZOJ 3672】 3672: [Noi2014]购票 (CDQ分治+点分治+斜率优化)**
3672: [Noi2014]购票 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国 ...
- java.lang.NegativeArraySizeException
两台android设备发送图片. 发送端: Socket socket = null; try { socket = new Socket(ip, 8888); byte[] bytes = Scre ...
- HihoCoder - 1715 树的连通问题
题面在这里! 正式告别文化课回归的第一题QWQ,然鹅半个月之后还是要退役QWQWQWQWQ 好像很久之前就见过的一个题,当时只会打一打 O(N^2) 的暴力QWQ,正好今天又写了遍这个暴力用来对拍23 ...
- Codeforces Round #127 (Div. 1) C. Fragile Bridges dp
C. Fragile Bridges 题目连接: http://codeforces.com/contest/201/problem/C Description You are playing a v ...
- 转:Oracle密码过期,取消密码180天限制
原文:https://www.cnblogs.com/soar-gh/p/5949158.html 1.进入sqlplus模式 sqlplus / as sysdba; 2.查看用户密码的有效期设置( ...
- selector简介
最近在学习java NIO,发现java nio selector 相对 channel ,buffer 这两个概念是比较难理解的 ,把学习理解的东西以文字的东西记录下来,就像从内存落地到硬盘,把内存 ...
- 5 Best Gantt Chart JIRA Plugins
Andrew Stepanov/June 23, 2017/6 minutes Software developers enjoy using JIRA software for their proj ...
- Oracle SQL执行缓慢的原因以及解决方案
以下的文章抓哟是对Oracle SQL执行缓慢的原因的分析,如果Oracle数据库中的某张表的相关数据已是2亿多时,同时此表也创建了相关的4个独立的相关索引.由于业务方面的需要,每天需分两次向此表中 ...
- 在 Ubuntu 14.04 上安装 Ubuntu Tweak 0.8.8
转自:http://linux.cn/article-3335-1.html 关于 Ubuntu Tweak,Ubuntu 老用户再熟悉不过了,Ubuntu tweak 相当于 windows 的优化 ...