ESP-IDF 与 MAVLink UART 通信问题

问题描述 投票:0回答:1

我正在尝试从 Arduino 框架迁移到 ESP-IDF。我正在尝试在 ESP-IDF 中重写我的代码,但遇到了问题。这是我的代码:

#define UART_BUF_SIZE 1024

void read_uart_task(void *pvParameters)
{
   
 // Create a buffer to store received data
    uint8_t data[UART_BUF_SIZE];
    // Create a MAVLink message and status structures
    mavlink_message_t msg;
    mavlink_status_t status;

    while (1)
    {
        
        memset(data, 0, sizeof(data));
        int len = uart_read_bytes(UART_MAV, data, UART_BUF_SIZE, 20 / portTICK_PERIOD_MS);
         
        if (len > 0)
        {
            gpio_set_level(LED_PIN, !gpio_get_level(LED_PIN));
            for (int i = 0; i < len; i++)  mavlink_parse_char(MAVLINK_COMM_0, data[i], &msg, &status);
                 
            switch (msg.msgid)
            {
                case MAVLINK_MSG_ID_HEARTBEAT:
                {
                    mavlink_heartbeat_t heartbeat;
                    mavlink_msg_heartbeat_decode(&msg, &heartbeat);
                    // Access the decoded fields
                    uint8_t type = heartbeat.type;
                    uint8_t autopilot = heartbeat.autopilot;
                    uint8_t base_mode = heartbeat.base_mode;
                    uint32_t custom_mode = heartbeat.custom_mode;
                    uint8_t system_status = heartbeat.system_status;

                    char output[512];  // Adjust the size accordingly
                    sprintf(output, "Heartbeat Data:\nType: %d\nAutopilot: %d\nBase Mode: %d\nCustom Mode: %lu\nSystem Status: %d \n\r",
                            type, autopilot, base_mode, custom_mode, system_status);
                    send_data_over_uart(output);
                     

                }
                break;

            default:

                break;
            }
        }
        
        vTaskDelay(200/portTICK_PERIOD_MS);
    }
  
}

这段代码的输出如下所示,我确信它不正确,因为它会不规律地变化,并且给定的值没有任何意义。此外,将我之前的代码与 Arduino.h 一起使用可以在相同的硬件上完美运行。如果有人能告诉我任何相关信息,我会非常高兴。

Heartbeat Data:
Type: 0
Autopilot: 24
Base Mode: 30
Custom Mode: 0
System Status: 6

Heartbeat Data:
Type: 0
Autopilot: 0
Base Mode: 0
Custom Mode: 101095582
System Status: 0

Heartbeat Data:
Type: 0
Autopilot: 0
Base Mode: 0
Custom Mode: 101095582
System Status: 0

我尝试过修改变量类型、更改 UART 参数以及降低波特率。

esp32 esp-idf mavlink
1个回答
0
投票

我会尝试以下方法:

1.- 使用

Print registers and halt (CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT)
选项而不是默认选项
Print registers and reboot (CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT)
构建项目。这样,您就可以捕获 RTOS 中的错误。看: 紧急处理程序部分

2.- 然后打开终端以接收错误消息。如果 RTOS 出现恐慌,你就会知道。

3.- 当您 vTaskCreate read_uart_task 时,您是否提供了足够的堆栈?我可以看到那里的一些数组可能消耗了太多堆栈。

© www.soinside.com 2019 - 2024. All rights reserved.