ESP8266 的串口(UART)使用

ESP8266拥有2个UART,UART0默认用于固件下载和日志,UART1仅支持TX。UART0的波特率范围广泛,硬件FIFO为128Bytes。在需要UART通信时,建议使用UART1避免日志干扰。ESP8266的UART0在上电时会输出信息,可通过API或menuconfig关闭日志。对于高波特率可能导致的数据丢失,可以启用硬件流控或降低波特率。AT固件的默认串口和波特率也可根据需求调整。
摘要由CSDN通过智能技术生成

通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称为 UART ),详细说明请参见:UART(百度百科)

【总体介绍】

  • ESP8266 有 2 组 UART 口,分别为 UART0 和 UART1
  • 默认 UART0 主要是用做固件下载程序日志输出
  • UART1 因为只支持 TX,所以一般在需要 UART 用于通讯时,建议用 UART1 来输出日志信息。参见《ESP8266 技术规格书》说明。
    在这里插入图片描述

1 ESP8266 下载串口(UART)


2 ESP8266 日志输出串口(UART)

  • ESP8266 软件中默认使用的是 UART0 来输出程序日志。
  • ESP8266 芯片上电启动的 一级 bootloader 的输出日志的串口波特率为 74880 bps (此波特率不可更改),使用的是外部 26MHz 的芯片启振晶振。请参考 “ESP8266_RTOS_SDK/components/bootloader_support/src/bootloader_init.c” 说明。
  • ESP8266 的程序运行输出日志默认使用的串口波特率为 74480 bps,使用的是 SPI Speed 的 40MHz 的晶振,与 CPU 主频有关。可在 menuconfig 中进行修改,如下:
    menuconfig —> Component config —> Common ESP-related —> UART console baud rate

    在这里插入图片描述
    默认设置范围是 1200 bps ~ 4M bps ,如下:
    在这里插入图片描述

2.1 目前屏蔽 UART0 的日志输出方式有两种:


通过调用相关 API 来屏蔽 UART0 的日志输出:
  • 只屏蔽应用层的打印,调用 UART_SetPrintPort(UART1) 或者 system_uart_swap() 函数就可以了。

  • 屏蔽掉所有信息(从 boot 启动阶段就开始屏蔽掉),调用system_uart_swap() 函数,同时要在硬件上做修改,具体的原理可参考《ESP8266 技术参考手册》 page 88~89。注意:system_uart_swap() 函数屏蔽的是通过 GPIO13 和 GPIO15 来作为串口输出的 log 。
    在这里插入图片描述

通过 menuconfig 配置端可关闭的日志如下:
  • 关闭 Bootloader 日志:

    menuconfig -> bootloader config --> bootloader log verbosity 选定为 No output 。

  • 关闭程序运行日志:

    menuconfig -> Component config --> log output --> Default log verbosity 选定为 No output 。

  • 关闭其他日志输出:

    menuconfig -> Component Config ->Common ESP-related -> Channel for console output -> None 。

  • 更换程序日志输出串口为 UART1:

    menuconfig -> Component Config ->Common ESP-related -> Channel for console output -> Custom UART -> UART peripheral to use for console output(0-1) -> UART1。



3 ESP8266 串口(UART)通信

参考资料:

  • ESP8266 在上电时候,UART0 默认会输出⼀些打印信息,如果对此敏感的应⽤,可以使用 UART 的内部引脚交换功能,在初始化的时候,将 U0TXD、U0RXD 分别与 U0RTS(GPIO15)、 U0CTS(GPIO13) 交换来与 MCU 进行 UART 通信。可参考《ESP8266 技术参考手册》 page 88~89

  • 通过 UART0 的 U0RTS(GPIO15)、 U0CTS(GPIO13) 管脚交换来实现 ESP8266 与其他芯片的 UART 通信时,交换管脚 MTDO(GPIO15)作为 TXD 、MTCK(GPIO13)作为 RXD 。
    在这里插入图片描述

  • ESP8266 通过 UART0 的 U0RTS(GPIO15)、 U0CTS(GPIO13) 管脚交换与另一个芯片的 UART 通讯时,可调用 uart_enable_swap() API 来实现。参考 “ESP8266_RTOS_SDK/components/esp8266/driver/uart.c

      esp_err_t uart_enable_swap(void)
      {
          // wait for tx done.
          uart_wait_tx_done(UART_NUM_0, portMAX_DELAY);
      
          UART_ENTER_CRITICAL();
          // MTCK -> UART0_CTS -> U0RXD
          PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_UART0_CTS);
          // MTD0 -> UART0_RTS -> U0TXD
          PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_UART0_RTS);
          // enable swap U0TXD <-> UART0_RTS and U0RXD <-> UART0_CTS
          SET_PERI_REG_MASK(UART_SWAP_REG, 0x4);
          UART_EXIT_CRITICAL();
      
          return ESP_OK;
      }
    
  • ESP8266 的 UART0 例程参考:ESP8266_RTOS_SDK/examples/peripherals

    包含如下测试例程:


【ESP8266 UART 通信常见应用问题】

  • ESP8266 的串⼝波特率范围是多大?

    ESP8266 的串⼝波特率范围从 300 到 115200*40 都可以⽀持。参见 《ESP8266 技术参考手册》中的 “ 11.3.1. 波特率 ”章节说明。


  • ESP8266 UART 的硬件 FIFO 是多大?

    ESP8266 的 UART0 和 UART1 各有⼀个⻓度为 128 Bytes 的硬件 FIFO,读写 FIFO 都在同⼀个地址操作。参见 《ESP8266 技术参考手册》中的 “ 11.2. 硬件资源 ”章节说明。


4 ESP8266 AT 传输串口

参考资料:ESP8266 ESP-AT User Guide


5 ESP8266 串口(UART) 性能

  • ESP8266 的波特率硬件是可以支持到 4.5 Mbps, 但是不建议软件使用这么高的波特率, 原因有两点:

    • 接收模式下,波特率太高,大量数据传输软件可能无法及时取走硬件 FIFO 中的数据从而导致数据丢失。ESP8266 的硬件 UART FIFO128 Bytes , ESP8266 的 UART 说明你可以阅读 《ESP8266 技术参考手册》 ,建议波特率不要超过 2 Mbps。如果系统有很多中断或有使用 Wi-Fi,该值需要低一点,以证数据不会丢失。

    • 有些串口芯片无法支持这么高的波特率,或者 ESP8266 波特率误差超过串口芯片允许的误差范围,因为当波特率不能被 ESP8266 串口模块时钟(80 MHz)整除的时候,就存在误差。

  • 当 UART 波特率过高导致接收数据丢失时,我们的建议:

    • 增加 UART 硬件流控
    • 降低 UART 波特率
  • 15
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: ESP8266是一款集成了Wi-Fi模块的芯片,它可以通过与其他设备的UART串口)进行通信实现透传功能。 在使用ESP8266实现UART透传时,需要配置好串口的波特率、数据位、停止位和校验位等参数,以便与其他设备进行正确的通信。 首先,我们需要设置ESP8266串口模式。ESP8266有两个串口,一个是UART0,可以通过GPIO1(TXD0)和GPIO3(RXD0)引脚进行通信;另一个是UART1,可以通过GPIO2(TXD1)和GPIO9(RXD1)引脚进行通信。根据具体需求选择合适的串口,并将其设置为透传模式。 其次,我们需要配置串口的参数。通过设置串口的波特率(如9600、115200等)、数据位(如8位)、停止位(如1位)和校验位(如无校验),确保与其他设备的串口参数一致。这样才能实现正常的透传通信。 最后,在代码中编写逻辑,将从一个串口收到的数据直接发送到另一个串口上,实现透传功能。这可以通过不断监听一个串口的接收缓冲区,一旦有数据可读,则立即将其发送到另一个串口上。这样,其他设备发送给ESP8266的数据将直接通过ESP8266串口透传到其他设备上。 需要注意的是,透传功能需要容错处理,即在发送数据时需要添加出错检测和重发机制,以确保数据的可靠传输。 综上所述,ESP8266可以通过与其他设备的UART进行通信实现透传功能。通过配置串口的参数并在代码中编写逻辑,可以实现从一个串口接收数据并直接发送到另一个串口上。这样,即可实现UART之间的透传。 ### 回答2: ESP8266是一种高集成度、低功耗的Wi-Fi模块,具有强大的串口功能。通过ESP8266UART(串行通信接口),可以实现UART之间的透传。 首先,需要将两个UART设备(例如电脑的串口ESP8266串口)连接起来。可以使用杜邦线将它们的TX(发送)和RX(接收)引脚相连,确保电平匹配。 接下来,在ESP8266的代码中,需要初始化UART的配置。可以使用ESP8266的SDK或Arduino平台来编写代码。首先,需要设置波特率(例如9600)和数据位、停止位、校验位的配置。然后,通过调用UART接收函数,可以读取从另一个UART设备传输过来的数据,然后再通过调用UART发送函数,将数据发送到另一个UART设备。 在代码中,可以选择使用循环来不断地接收和发送数据,从而实现UART之间的透传。例如,通过一个while循环,不断地调用接收函数,并将接收到的数据发送到另一个UART设备。 此外,为了确保数据的稳定传输,还可以使用缓冲区来缓存接收到的数据,并且设置适当的延时时间等待数据完全传输。 总结起来,实现ESP8266 UART之间的透传,需要连接两个UART设备,初始化UART的配置,编写代码来实现接收和发送数据的功能,使用循环和缓冲区等方法来保证数据的稳定传输。这样,就能够实现UART之间的透传。 ### 回答3: ESP8266具备多个UART串口)接口,可以实现串口之间的透传功能。透传是指数据从一个串口输入,直接通过ESP8266模块转发到另一个串口输出,实现两个串口之间的数据传输。 要实现UART之间的透传功能,首先需要确认ESP8266模块上有足够的UART接口可供使用。然后,通过编程设置相关参数,如波特率、数据位、停止位、校验位等。确保两个UART配置相同,以保证数据的正确传输。 接下来,需要编写代码,通过ESP8266的软件串口功能来实现透传。可以使用arduinoIDE或其他开发工具,选择合适的库来进行串口的配置与数据的传输。 在代码中,需要调用相关的串口初始化函数来设置和打开两个UART串口通信。可以使用Serial.begin()函数来初始化串口,并使用Serial.available()函数来判断串口接收缓冲区是否有数据可用。通过Serial.read()函数读取缓冲区中的数据,并使用Serial.write()函数将数据写入到另一个串口的发送缓冲区。 在循环函数中,可以不断地检测一个串口是否有可用的数据,如果有,则读取数据并发送到另一个串口。这样就可以实现UART之间的透传功能。 需要注意的是,为了正确传输数据,需要保证两个串口之间的通信完全匹配,包括波特率、数据位、停止位和校验位等参数的设置。同时,需要考虑到数据丢失和错误校验等问题,可以添加一些错误检测和纠正的机制来提高数据的可靠性。 总之,通过ESP8266的多个UART接口,可以实现串口之间的透传功能。通过适当的设置和编程,可以方便地实现串口数据的传输,并且提高数据传输的可靠性和稳定性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值