ESP32+idf开发之WIFI通信入门(3)TCP通信

ESP32+idf开发之WIFI通信入门(3)TCP通信

一、实现功能:

1、数据上行:在esp32板子上编写tcp客户端程序,每隔3秒钟向tcp服务端(网络调试助手)发送字符串“hello, I am tcp_client!”;

2、数据下行:esp32能够接收服务端发来的指令,解析后控制板子上的led的亮和灭;

3、能同时运行在数据的上下行状态;

二、步骤:

1、使用vscode新建一个空的sample_project工程,将idf中用于wifi连接的公共非标准组件(Espressif\frameworks\esp-idf-v4.4.1\examples\common_components\protocol_examples_common),复制到我们的自定义组件目录components中。

进入终端命令行:

mkdir components

cp -r D:\Espressif\frameworks\esp-idf-v4.4.1\examples\common_components\protocol_examples_common .\components

image-20230321214245939

2、在main.c中编写实现以上功能的代码

#include <esp_log.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <esp_system.h>

#include <esp_event.h>
#include <nvs_flash.h>
#include <esp_netif.h>

#include <protocol_examples_common.h>
#include <lwip/sockets.h>
#include <driver/gpio.h>

static char *TAG = "tcp_client";

static int sock;

// 功能二
#define LED_PIN GPIO_NUM_2 // led对应的gpio口
void led_init()
{
    gpio_config_t cfg = {
        .pin_bit_mask = 1 << LED_PIN,
        .mode = GPIO_MODE_OUTPUT,
        .intr_type = GPIO_INTR_DISABLE,
        .pull_up_en = GPIO_PULLUP_DISABLE,
        .pull_down_en = GPIO_PULLDOWN_DISABLE,
    };
    ESP_ERROR_CHECK(gpio_config(&cfg)); // 对gpio进行初始化配置
}
void led_on()
{
    ESP_ERROR_CHECK(gpio_set_level(LED_PIN, 1));
}
void led_off()
{
    ESP_ERROR_CHECK(gpio_set_level(LED_PIN, 0));
}
static void my_led_task(void *pvParameters) // 控制led亮灭的任务
{
    led_init();
    while (1)
    {
        char cmd;
        int count = recv(sock, &cmd, 1, 0); // 接收服务端发来的控制指令
        if (count > 0)
        {
            if (cmd == '1')
            {
                led_on(); // led灯亮
            }
            else if (cmd == '0')
            {
                led_off(); // led灯灭
            }
        }
    }
}

void app_main(void)
{
    ESP_ERROR_CHECK(nvs_flash_init());
    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    // esp32连接wifi热点
    ESP_ERROR_CHECK(example_connect());

    // 创建socket:socket();
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0)
    {
        ESP_LOGE(TAG, "create socket failed!");
        return;
    }
    ESP_LOGI(TAG, "create socket successfully!");

    // 初始化server的地址结构体sockaddr_in
    struct sockaddr_in destaddr = {};
    destaddr.sin_family = AF_INET;
    destaddr.sin_port = htons(3333);                      // 填写网络调试助手服务端实际端口
    destaddr.sin_addr.s_addr = inet_addr("10.26.65.239"); // 填写网络调试助手服务端实际IP地址

    // 建立socket连接:
    socklen_t len = sizeof(struct sockaddr);
    if (connect(sock, (struct sockaddr *)&destaddr, len) < 0)
    {
        ESP_LOGE(TAG, "connect to server failed!");
        close(sock);
        return;
    }
    ESP_LOGI(TAG, "connect to server successfully!");

    // 创建任务来实现功能一和功能二同时运行
    xTaskCreate(my_led_task, "my_led", 4096, NULL, 5, NULL);

    // 功能一
    while (1)
    {
        // 发送数据给服务端:send();
        char buff[512] = "hello, I am tcp_client!";
        send(sock, buff, strlen(buff), 0);
        vTaskDelay(pdMS_TO_TICKS(3000));
    }
}

3、配置wifi连接设置,打开终端命令界面输入idf.py menuconfig,进入到Example Connection Configuration界面对热点信息的ssid和password等配置。

image-20230321221245559

三、测试

编译、烧录到esp32中,打开手机热点,并打开网络调试助手服务端,点击vscode的monitor按钮,查看与服务端建立socket连接。

image-20230321222400544

在网络调试助手可以看到每间隔三秒收到数据打印:hello, I am tcp_client! 同时发送字符1控制led灯亮,发送字符0控制led灯灭。

image-20230321222645002
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值