关于Esp-idf 的 uart_echo应用例程解读


一、准备工作

1.下载好串口调试小助手

界面如下
在这里插入图片描述
左上角的串口号是指USB TO TTL转接器所接入电脑的串口位置。实物图如下所示:
在这里插入图片描述
在这里插入图片描述

2.准备好连接esp32单片机

在这里插入图片描述

3.找到uart文件夹

打开Visual Studio Code软件,点击左上角文件,点击选择文件夹。按照如下红色圈记路径找到uart echo文件夹。
在这里插入图片描述
鼠标点击选择文件夹,Visual Studio Code软件界面如下。
在这里插入图片描述


二、改写程序

原始程序文件夹中有此处不再展示,以下是改写以及注释好之后的代码:

/* UART Echo Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"//freertos系统文件
#include "freertos/task.h"//任务创建
#include "driver/uart.h"//串口驱动
#include "driver/gpio.h"//gpio(引脚,输入输出)
#include "sdkconfig.h"

/**
 * This is an example which echos any data it receives on configured UART back to the sender,
 * with hardware flow control turned off. It does not use UART driver event queue.
 *
 * - Port: configured UART
 * - Receive (Rx) buffer: on
 * - Transmit (Tx) buffer: off
 * - Flow control: off
 * - Event queue: off
 * - Pin assignment: see defines below (See Kconfig)
 */

//#define ECHO_TEST_TXD (CONFIG_EXAMPLE_UART_TXD)
//#define ECHO_TEST_RXD (CONFIG_EXAMPLE_UART_RXD)
#define ECHO_TEST_TXD 15//esp32的发送引脚
#define ECHO_TEST_RXD 4//esp32de接收引脚
#define ECHO_TEST_RTS (UART_PIN_NO_CHANGE)
#define ECHO_TEST_CTS (UART_PIN_NO_CHANGE)

//#define ECHO_UART_PORT_NUM       //串口号(CONFIG_EXAMPLE_UART_PORT_NUM)
//#define ECHO_UART_BAUD_RATE     //波特率(CONFIG_EXAMPLE_UART_BAUD_RATE)
//#define ECHO_TASK_STACK_SIZE     //任务栈大小(CONFIG_EXAMPLE_TASK_STACK_SIZE)
#define ECHO_UART_PORT_NUM      2      //uart的端口号
#define ECHO_UART_BAUD_RATE     9600    //uart的波特率
#define ECHO_TASK_STACK_SIZE    1024   //任务堆栈大小
#define BUF_SIZE (1024) //uart缓冲区大小
int count1=0;//用以计数
//任务1
static void echo_task1(void *arg)
{
    /* Configure parameters of an UART driver,
     * communication pins and install the driver */
    uart_config_t uart_config = {
        .baud_rate = ECHO_UART_BAUD_RATE,//uart波特率
        .data_bits = UART_DATA_8_BITS,//uart数据位,此处是8位
        .parity    = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,//停止位(此处是1)
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_APB,
    };
    int intr_alloc_flags = 0;

#if CONFIG_UART_ISR_IN_IRAM
    intr_alloc_flags = ESP_INTR_FLAG_IRAM;
#endif

    ESP_ERROR_CHECK(uart_driver_install(ECHO_UART_PORT_NUM, BUF_SIZE * 2, 0, 0, NULL, intr_alloc_flags));
    ESP_ERROR_CHECK(uart_param_config(ECHO_UART_PORT_NUM, &uart_config));
    ESP_ERROR_CHECK(uart_set_pin(ECHO_UART_PORT_NUM, ECHO_TEST_TXD, ECHO_TEST_RXD, ECHO_TEST_RTS, ECHO_TEST_CTS));

    // Configure a temporary buffer for the incoming data
    uint8_t *data = (uint8_t *) malloc(BUF_SIZE);

    while (1) {
        // Read data from the UART(uart接收来自串口调试小助手发送的信息)
        int len = uart_read_bytes(ECHO_UART_PORT_NUM, data, BUF_SIZE, 20 / portTICK_RATE_MS);//所接收数据的长度
        // Write data back to the UART
        //uart_write_bytes(ECHO_UART_PORT_NUM, (const char *) data, len);
        uart_write_bytes(ECHO_UART_PORT_NUM, (const char *) data, len);//将接收到的数据发送到串口小助手
          if(len>2)//如果串口接收数据的长度大于2,则发送“uart2:yes”信息至串口调试小助手
        {
            uart_write_bytes(ECHO_UART_PORT_NUM, "uart2:yes\n", 10);
        } 
        count1+=len;//计数
    }
}
void app_main(void)
{
    printf("aaa\n");//运行提示
    xTaskCreate(echo_task1, "uart_echo_task", ECHO_TASK_STACK_SIZE, NULL, 10, NULL);
    int i=0;
    while(1)
    {
        vTaskDelay(1000 / portTICK_RATE_MS);//延迟1000ms(1秒)
        i++;//计时
        printf("%d:count1=%d\n",i,count1);
        uart_write_bytes(2, "#001P2000T1000!\n", 16);//实时发送数据至串口调试小助手
    }
    
}

划重点

1.定义串口号为2,设置串口波特率为9600

#define ECHO_UART_PORT_NUM      2      //uart的端口号
#define ECHO_UART_BAUD_RATE     9600    //uart的波特率
#define ECHO_TASK_STACK_SIZE    1024   //任务堆栈大小

2.定义好esp32的发送引脚和接收引脚,15,4两个数字代表对应单片机上的引脚号。

#define ECHO_TEST_TXD 15//esp32的发送引脚
#define ECHO_TEST_RXD 4//esp32de接收引脚

3.此处的len是指从串口小助手接收到的信息的长度,如串口小助手发送字符串“asdc”,则len=4;

int len = uart_read_bytes(ECHO_UART_PORT_NUM, data, BUF_SIZE, 20 / portTICK_RATE_MS);

4.这两个函数是串口信息收发的关键。read函数表示esp332从串口小助手读入数据也就是实现RXD(接收功能)。 write函数表示将信息发送到串口小助手。实现TXD(发送)功能。

uart_read_bytes(ECHO_UART_PORT_NUM, data, BUF_SIZE, 20 / portTICK_RATE_MS);
uart_write_bytes(ECHO_UART_PORT_NUM, (const char *) data, len);

三、测试步骤

1.将程序下载到单片机中

首先连接好单片机,记住接入的端口号
在这里插入图片描述
然后点击下图红色圈记部分,选择单片机连接的串口号。

在这里插入图片描述
再按住单片机sw1按钮不要松手,再按住sw2,再松手进行单片机的重启。随后页面会出现“waiting for download” (等待下载),再点击下图红色圈记部分,把程序下载到单片机中。
在这里插入图片描述
然后会出现黄色的信息,说明已经下载完成,按下单片机的sw2按钮便开始运行。终端会输出代码中prinft的内容。
在这里插入图片描述
在这里插入图片描述

2.单片机连接USB TO TTL转接器

我写的代码中此处15号引脚为数据发送,4号为接收。
将15处连转接器的接收端RXD,4处连转接器的发送端TXD。单片机的GND接转接器的GND。
在这里插入图片描述
在这里插入图片描述

3.测试串口调试小助手接收发功能

在这里插入图片描述
左上后串口号选择USB TO TTL的端口号,波特率与esp32对应选择9600,校验位选择NONE,数据位与esp32代码中对应选择8,停止位对应选1。再点击打开即可接收以及发送数据。(补充:接收设置可以选择ASCII,即接收到的是发送的原文本,也可以选择HEX十六进制接收数据,HEX所代表的含义可通过计算得ASCII值。发送设置同理)。下方的发送框即是串口调试小助手发送给esp32的数据。测试如下:
蓝色划线表示SEND发送"1232"给esp32,而esp32也会发送同样的数据“1232”给串口小助手。即红色RECV接收到1232,此外len=4>3还会接收到esp32发送的“uart2:yes”信息。而esp32中count1=count1+len,count计数同样发生了改变。由16+4变成12。printf里面的内容会在终端显示。
在这里插入图片描述

四、总结

uart_echo例源主要实现esp32和串口调试助手间的数据接收,发送功能。注意好发收对应的引脚,正确选择好对应的端口在此例中很重要。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用ESP-IDF框架的ESP32 SPI3通信的示例代码: ```c #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/spi_master.h" #define PIN_CLK 18 #define PIN_MISO 19 #define PIN_MOSI 23 #define PIN_CS 5 void spi_task(void *pvParameters) { spi_device_handle_t spi; spi_bus_config_t bus_config = { .mosi_io_num = PIN_MOSI, .miso_io_num = PIN_MISO, .sclk_io_num = PIN_CLK, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 0, }; spi_device_interface_config_t dev_config = { .command_bits = 0, .address_bits = 0, .dummy_bits = 0, .mode = 0, .duty_cycle_pos = 0, .cs_ena_pretrans = 0, .cs_ena_posttrans = 0, .clock_speed_hz = 1000000, // 设置时钟频率为1MHz .input_delay_ns = 0, .spics_io_num = PIN_CS, .flags = 0, .queue_size = 1, .pre_cb = NULL, .post_cb = NULL, }; spi_device_handle_t spi_handle; spi_bus_initialize(VSPI_HOST, &bus_config, 1); spi_bus_add_device(VSPI_HOST, &dev_config, &spi_handle); while (1) { uint8_t send_data = 0x55; uint8_t recv_data; spi_transaction_t trans_desc = { .flags = 0, .cmd = 0, .addr = 0, .length = 8, // 数据位宽为8位 .rxlength = 8, .tx_buffer = &send_data, .rx_buffer = &recv_data, }; spi_device_polling_transmit(spi_handle, &trans_desc); printf("Received data: 0x%02x\n", recv_data); vTaskDelay(1000 / portTICK_PERIOD_MS); } } void app_main() { xTaskCreate(spi_task, "spi_task", 2048, NULL, 10, NULL); } ``` 在这个示例中,我们使用了ESP32的VSPI总线,并且将引脚18、19和23分别连接到SPI3的CLK、MISO和MOSI信号。引脚5用作CS(片选)信号。 我们首先定义了SPI总线和设备的配置参数。然后,通过调用spi_bus_initialize()函数初始化SPI总线,并通过spi_bus_add_device()函数将SPI设备添加到总线上。 在任务函数spi_task()中,我们创建了一个spi_transaction_t结构体来描述传输的参数。然后,我们使用spi_device_polling_transmit()函数来发送和接收数据。 最后,我们在app_main()函数中创建了一个任务来执行SPI通信操作。 请根据你的具体需求进行适当的修改和配置。希望这个例程能帮助你使用ESP-IDF框架进行ESP32 SPI3通信!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向丞哥学习。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值