使用ESP32C3中串口的小坑

在使用合宙的ESP32C3的串口的时候遇到一个莫名其妙的问题,串口无法正常工作。程序能够正常上传,但是串口没有数据。

仔细阅读官方的文档也没有找到原因。

 串口芯片的驱动也正常安装,能够识别到CH343

 经过不断探索发现是Flash Mode的问题,默认是QIO,需要设置为DIO

需要注意的是USB CDC On Boot的选项也要设置为Disable,如果Enable的话会占用默认串口。

 

 此外对于ESP32的串口引脚可以通过程序配置,而且是硬件层面实现,不是Uno中的softwareSerial模式。

看下面这个例子就很清楚了

// Need this for the lower level access to set them up.
#include <HardwareSerial.h>

//Define two Serial devices mapped to the two internal UARTs
HardwareSerial MySerial0(0);
HardwareSerial MySerial1(1);

void setup()
{
    // For the USB, just use Serial as normal:
    Serial.begin(115200);

    // Configure MySerial0 on pins TX=6 and RX=7 (-1, -1 means use the default)
    MySerial0.begin(9600, SERIAL_8N1, -1, -1);
    MySerial0.print("MySerial0");

    // And configure MySerial1 on pins RX=D9, TX=D10
    MySerial1.begin(115200, SERIAL_8N1, 9, 10);
    MySerial1.print("MySerial1");
}

void loop(){
  MySerial0.print("MySerial0");
  MySerial1.print("MySerial1");
  delay(10);
}

Serail0为默认USB连线的串口,可以在串口监视器中看到数据。

也可以接个USB转串口模块,接到6、7号引脚接收串口数据。

 

 

Serial1被绑定到9号和10号引脚,连接一个USB转串口的模块就可以接收串口数据

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ESP32-C3串口使用方法如下: 1. 首先需要调用 `uart_isr_free()` 函数释放 UART 断。 2. 使用 `uart_isr_register()` 函数注册 UART 断处理函数。 3. 在 UART 初始化时,需要打开断并设置一个断触发的阈值(如接收缓冲区数据个数),当达到阈值时触发断。 4. 在断处理函数,需要使用 `uart_intr_enable()` 函数清除断标志并重新设置阈值,以便下次触发断。 以下是一个示例代码: ```c #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/uart.h" #define UART_NUM UART_NUM_0 #define BUF_SIZE 1024 void uart_intr_handler(void *arg) { uint16_t rx_fifo_len, status; uint8_t buf[BUF_SIZE]; status = UART0.int_st.val; rx_fifo_len = UART0.status.rxfifo_cnt; while (rx_fifo_len) { int len = uart_read_bytes(UART_NUM, buf, BUF_SIZE, 0); for (int i = 0; i < len; i++) { // 处理接收到的数据 } rx_fifo_len = UART0.status.rxfifo_cnt; } uart_intr_enable(UART_NUM, UART_RXFIFO_FULL_INT_CLR_MASK); } void uart_init() { uart_config_t uart_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, }; uart_param_config(UART_NUM, &uart_config); uart_isr_free(UART_NUM); uart_isr_register(UART_NUM, uart_intr_handler, NULL, ESP_INTR_FLAG_IRAM, NULL); uart_set_pin(UART_NUM, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); uart_driver_install(UART_NUM, BUF_SIZE * 2, 0, 0, NULL, 0); uart_intr_enable(UART_NUM, UART_RXFIFO_FULL_INT_ENA_MASK); uart_enable_rx_intr(UART_NUM); } void app_main() { uart_init(); // 其他初始化操作 // ... while (1) { // 主任务循环 // ... } } ``` 在上面的代码,我们首先定义了一个断处理函数 `uart_intr_handler()`,当 UART 接收缓冲区数据个数达到阈值时会触发该函数。在断处理函数,我们使用 `uart_read_bytes()` 函数读取接收缓冲区的数据,并进行处理。 接着我们定义了一个 `uart_init()` 函数,该函数用于初始化 UART。在初始化函数,我们先调用 `uart_param_config()` 函数设置 UART 参数,然后注册断处理函数,设置 UART 引脚,并安装 UART 驱动。最后,我们打开接收断并使能接收断。 在主任务循环,我们可以进行其他操作。当接收到数据时,断处理函数会自动被调用,处理接收到的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值