我正在尝试从 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 参数以及降低波特率。
我会尝试以下方法:
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 时,您是否提供了足够的堆栈?我可以看到那里的一些数组可能消耗了太多堆栈。