代码地址如下:
http://www.demodashi.com/demo/13650.html

文章目录

  • 一、前言;
  • 二、`esp8266`的串口分布情况;
  • 三、`esp8266`的串口通讯时候,应该怎么接线;
  • 四、`esp8266`的`NONOS`非系统,串口编程;
  • 五、`esp8266`的`RTOS`实时系统,串口编程;
  • 六、开始封装串口编程成一个函数;
    • 1、写注册回调函数和注册回调函数;
    • 2、源文件调用;
    • 3、如何调用?
  • 七、看看打印的效果;
  • 八、下载与集成;
  • 九、工程架构;

一、前言;


  • 我们已经学习esp8266的方方面面都差不多了。貌似简单的串口通讯还没有提到,那么小徐精心准备下esp8266串口通讯封装的过程。

二、esp8266的串口分布情况;


①:esp8266有几个串口?

  • 答:我们常见的ESP8266-12f 有两个 UART,其中 UARTO 有 TX、RX,可做数据传输;UART1 由于 RX 脚被 SPI-Flash 占用,只能使用 TX,可以做串口调试信息打印。见下图:串口一是在GPIO2,只可以查看信息。


②:esp8266如何屏蔽上电打印??

  • 答:不管什么情况,U0TXD默认上电有系统打印,对此敏感应用可通过UART的内部引脚交换功能,在初始化的时候,调用system_uart_swap函数。将txdrxd 分别于U0RTS(MTDO/GPIO15)、U0CTS (MTCK/GPIO13)交换来屏蔽该上电的系统打印。 交换后,硬件上的下载管脚还是使用U0TXD + U0RXD,通信时需要将MTDO对应接到MCU的RXD,MTCK对应加到MCU的TXD。

三、esp8266的串口通讯时候,应该怎么接线;


  • 如下图所示,短脚txdrxd作为和单片机通讯的端脚,而gpio2作为系统打印的端口,用来查看系统日志。【记得要公地】


四、esp8266NONOS非系统,串口编程;


  • ①:乐鑫给出的关于这个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 计数使能中断 UART0WRITE_PERI_REG(UART_INT_CLR(UART0),UART_RXFIFO_FULL_INT_CLR | UART_RXFIFO_TOUT_INT_CLR);uart_rx_intr_enable(UART0);
}

五、esp8266RTOS实时系统,串口编程;


  • ①:RTOS实时系统的比NONOS的稍微复杂丢丢,实现的原理和过程也是一样的,通过中断,但是代码不一样,初始化配置如下:
void uart_init_new(void) {UART_WaitTxFifoEmpty(UART0);UART_WaitTxFifoEmpty(UART1);//下位机通讯串口设置:串口0UART_ConfigTypeDef uart_config;uart_config.baud_rate = BIT_RATE_9600; //波特率为9600uart_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;//波特率为74880UART_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[]数组就是接收到单片机的数据}

六、开始封装串口编程成一个函数;


下面的过程都是适用NONOSRTOS的;


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());}

七、看看打印的效果;



八、下载与集成;


  • 添加到您的现有工程中,注意要去掉自带的uart.huart.c文件,毕竟会造成冲突!如果rots编译发现缺少UART_RXD_INV,那么请手动添加uart_register.h文件!

  • 最后,共勉成果!


九、工程架构;


乐鑫esp8266的串口通讯驱动源文件,nonos和rtos版本

代码地址如下:
http://www.demodashi.com/demo/13650.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

乐鑫esp8266的串口通讯驱动源文件,nonos和rtos版本相关推荐

  1. Esp8266 进阶之路36【外设篇】乐鑫esp8266芯片SDK编程驱动时间芯片 ds1302,同步网络时间到本地,再也不怕掉电断网也可以同步时间了!(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个"hello ...

  2. 乐鑫esp8266学习rtos3.0笔记第11篇:详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  3. 乐鑫esp8266学习rtos3.0笔记第9篇:整理分享那些我在项目中常用的esp8266 rtos3.0版本的常见驱动,Button按键长短按、PWM平滑调光等。(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个"hello ...

  4. 乐鑫esp8266学习rtos3.0笔记第7篇:我又来了,基于rtos3.0版本 SDK编程 SPI 驱动 ws2812b 七彩灯,代码全部开源奉献给你们!

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  5. Esp8266 进阶之路31【外设篇】分享一个乐鑫esp8266 SDK编程使用 IIC总线驱动 0.96寸的OLED显示屏,显示天气预报信息。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  6. 乐鑫esp8266学习rtos3.0笔记:如何在 windows 用 CMake 编译 ESP8266 项目。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 基于C SDK的ESP8266开发技术全系列笔记 一.N ...

  7. 乐鑫esp8266学习rtos3.0笔记第3篇: 一篇文章带你搞掂存储技术 NVS 的认识和使用,如何利用NVS保存整型、字符串、数组以及结构体。(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个" ...

  8. 乐鑫esp8266学习rtos3.0笔记:仅1M flash 的安信可 ESP-01S 模块,如何二次开发?如何对其 OTA 远程升级固件!

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个" ...

  9. 乐鑫esp8266学习rtos3.0笔记:分享在 esp8266 C SDK实现冷暖光色温平滑调节的封装,轻松集成到您的项目去。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 基于C SDK的ESP8266开发技术全系列笔记 一.N ...

最新文章

  1. android 实现定时通知,在Android中创建定时通知(例如,针对事件)
  2. .Net Core 3.1,这匹黑马,2020年值得所有程序员重视!
  3. 与Java EE和Spring的集成架构
  4. Android N 新特性 + APP开发注意事项
  5. navigator.geolocation的应用 - 将定位信息显示在百度地图上
  6. 同事说rar压缩有风险,让我用zip压缩文件
  7. ios(safar/微信)返回不执行js
  8. Tiktok现阶段最简单的三种变现模式,小白也可轻松上手
  9. 帆软报表设计器菜单栏介绍之二文件菜单
  10. wsl2启动桌面_「原创」windows10下自定义WSL安装路径及启动WSL2
  11. 51单片机交通信号灯c语言程序,89C51单片机交通灯程序
  12. 未转变者入侵服务器后台,未转变者(unturned)联机服务器创建方法
  13. oracle存货转资产,存货转固定资产账务处理
  14. android照片不小心删除,如何恢复安卓手机误删除的照片
  15. lower_bound 与 upper_bound
  16. 矢量科研数据质量检查方法
  17. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇三:批量处理后的txt文件入库处理
  18. C++调用win32 API操作打印机实现驱动打印
  19. ElasticSearch分布式搜索引擎从入门到实战应用(入门篇-基本命令操作)
  20. 为什么上传的格式是mp4在网页上无法播放是什么原因呢?

热门文章

  1. java求二阶微积分方程特解_Scipy:实现微分方程的两种方法:两种不同的解决方案:回答...
  2. 安卓 spinner下拉框 做模糊查询_SEO数据查询工具
  3. qgis二次开发环境搭建(超级详细)
  4. STM32“隐藏的定时器”-DWT
  5. python爬取qq音乐评论_教你用Python爬去QQ音乐评论
  6. jdk 安装_Linux安装JDK操作手册
  7. 【蓝桥杯嵌入式】【STM32】6_ADC之LCD实时显示电压值
  8. keil MDK编译器警告和错误详解(不定期更新)
  9. 调试 高通_高通平台调整通话音量
  10. RobotFramework_4.SeleniumLibrary操作(二)