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

摘要:
似乎还没有提到简单的串行通信,所以小徐仔细准备了包装esp8266串行通信的过程。

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

目录

一、前言;


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

二、esp8266的串口分布情况;


①:esp8266有几个串口?

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

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


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

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

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


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

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


四、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 计数使能中断 UART0
	WRITE_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);

	//下位机通讯串口设置:串口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版本》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇个人技术总结-Postman简单的使用数据绑定流程分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

操作系统-进程(5)进程通信机制

交互式并发进程通过信号量及PV操作可以实现进程的互斥与同步,例如生产者-消费者就是一组相互协作的进程,它们通过信号量来协同工作,并引入有界缓冲区来存取。这种低级通信方式不方便而且局限性很大。 管程适用于高级程序设计编程,它把分散在各进程中的临界区集中统一管理,采用阻塞/唤醒+集中临界区和一次状态测试策略,提供了同步工具的一种新选择。 上述工具可以解决同步和...

C# Socket网络编程精华篇

我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型     当然这里我们只讨论重要的四层        01,应用层(Application):应用层是个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应用协议,也有许多的企业应用和互联网应用。http协议在应用层运行。        02,传输层(Tan...

VS2010下MFC的串口编程

串口通信简介   一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色。当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API...

Linux C/C++编程之(十七)进程间通信

文章目录 一、概述 二、进程间通信概念及方法 1. 管道的概念 2. pipe 3. 管道的读写行为 4. 管道缓冲区大小 5. 管道优劣 6. FIFO 7. 共享存储映射 8. mmap函数 9. munmap函数 10. mmap九问 11. mmap父子进程间通信 12. 匿名映射 13. mmap无血缘关系进程间通信 3. 练习...

WebRTC通信流程

WebRTC是HTML5支持的重要特性之一,有了它,不再需要借助音视频相关的客户端,直接通过浏览器的Web页面就可以实现音视频对聊功能。而且WebRTC项目是开源的,我们可以借助WebRTC源码快速构建自己的音视频对聊功能。无论是使用前端JS的WebRTC API接口,还是在WebRTC源码上构建自己的对聊框架,都需要遵循以下执行流程: 上述序列中,We...

中介者模式

Mediator 中介者模式:中介模式封装一系列的对象交互,集中管理相关对象之间复杂的沟通和交互。中介者使各对象不需要明显的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。简单点来说,将原来两个直接引用或者依赖的对象拆开,在中间加入一个“中介”对象,使得两头的对象分别和“中介”对象引用或者依赖。 实现: Mediator:定义一个接...