解决ESP32 uart_read_bytes函数'Wint-conversion'和'Werror=uninitialized'错误
在使用ESP32的uart_read_bytes函数读取串口数据时,你可能会遇到以下错误:
/root/source/uart/main/uart.c:56:47: 警告: 传递参数 2 给 'uart_read_bytes' 时,整数转换成指针类型 [-Wint-conversion] 56 | rxBytes = uart_read_bytes(UART_NUM_0, data, 1, 20 / portTICK_PERIOD_MS); | ^~~~ | | | uint8_t {aka unsigned char}
/root/source/uart/main/uart.c:56:19: 错误: 'data' 未初始化 [-Werror=uninitialized] 56 | rxBytes = uart_read_bytes(UART_NUM_0, data, 1, 20 / portTICK_PERIOD_MS); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
错误分析
- 'Wint-conversion': 这是一个类型转换警告,表示你将一个整数类型的值传递给了需要指针类型的参数。在你的代码中,'data' 是一个 'uint8_t' 类型的变量,而 'uart_read_bytes' 函数的第二个参数需要一个指向存储读取数据的缓冲区的指针。
- 'Werror=uninitialized': 这是一个未初始化变量的错误,表示你在使用变量 'data' 之前没有对其进行初始化。
解决方案
- 将 'data' 声明为数组: 将 'data' 声明为一个 'uint8_t' 类型的数组,为其分配足够的存储空间,以便存储从串口读取的数据。
- 初始化 'data': 在使用 'data' 之前,确保对其进行初始化。你可以将其所有元素设置为0,或者根据你的需求进行其他初始化。
代码示例
#include 'driver/uart.h'
void app_main() {
// 将 'data' 声明为数组,并分配足够的空间
uint8_t data[100] = {0};
// 初始化串口
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,
.source_clk = UART_SCLK_APB,
};
uart_driver_install(UART_NUM_0, BUF_SIZE * 2, 0, 0, NULL, 0);
uart_param_config(UART_NUM_0, &uart_config);
uart_set_pin(UART_NUM_0, 1, 3, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
// 读取串口数据
int rxBytes = uart_read_bytes(UART_NUM_0, data, sizeof(data), 20 / portTICK_PERIOD_MS);
// 处理读取到的数据
if (rxBytes > 0) {
// ...
}
}
通过将 'data' 声明为数组并进行初始化,你就可以解决 'Wint-conversion' 和 'Werror=uninitialized' 错误,并在 ESP32 上成功使用 'uart_read_bytes' 函数读取串口数据。
原文地址: https://www.cveoy.top/t/topic/fZeH 著作权归作者所有。请勿转载和采集!