当前位置:首页 > 世界杯欧洲名额

串口读取数据的两种方式

admin 2025-10-08 03:10:18 5535

//-------------------------------------------------------------------------------------------------------------------

// 函数简介 读取串口接收的数据(whlie等待)

// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义

// 参数说明 *dat 接收数据的地址

// 返回参数 uint8 接收的数据

// 使用示例 uint8 dat = uart_read_byte(UART_1); // 接收 UART_1 数据 存在在 dat 变量里

// 备注信息

//-------------------------------------------------------------------------------------------------------------------

uint8 uart_read_byte (uart_index_enum uart_n)

{

while (!((uart_index[uart_n]->WATER & LPUART_WATER_RXCOUNT_MASK) >> LPUART_WATER_RXCOUNT_SHIFT));

return LPUART_ReadByte(uart_index[uart_n]);

}

//-------------------------------------------------------------------------------------------------------------------

// 函数简介 读取串口接收的数据(查询接收)

// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义

// 参数说明 *dat 接收数据的地址

// 返回参数 uint8 1:接收成功 0:未接收到数据

// 使用示例 uint8 dat; uart_query_byte(UART_1, &dat); // 接收 UART_1 数据 存在在 dat 变量里

// 备注信息

//-------------------------------------------------------------------------------------------------------------------

uint8 uart_query_byte (uart_index_enum uart_n, uint8 *dat)

{

uint8 return_state = 0;

if((uart_index[uart_n]->WATER & LPUART_WATER_RXCOUNT_MASK) >> LPUART_WATER_RXCOUNT_SHIFT)

{

*dat = LPUART_ReadByte(uart_index[uart_n]);

return_state = 1;

}

return return_state;

}

uart_read_byte(UART_INDEX);这行代码看起来是从串口中读取一个字节的数据并将其存储在 get_data 变量中。然而,这种读取方式可能是阻塞的,也就是说,如果没有可用的数据,它可能会一直等待直到有数据可读。这种方式可能会导致程序在等待数据到达时停滞不前,不执行其他任务。

uart_query_byte(UART_INDEX, &get_data);这行代码似乎是一种查询模式的接收方式。它可能是一个非阻塞的调用,意味着它会立即返回一个布尔值,告知是否接收到了数据。如果接收到数据,数据会存储在 get_data 变量中,并返回 TRUE;如果没有接收到数据,它会返回 FALSE。

这两种方式各有优缺点:

uart_read_byte 的阻塞方式会等待数据到达,但可能会阻碍程序执行其他任务。uart_query_byte 的非阻塞方式可以让程序继续执行其他任务,但需要在循环中不断查询是否有数据到达,可能增加 CPU 的负载。通常,如果你的应用程序要求及时响应数据到达,且没有其他重要任务需要处理,阻塞式的方式可能更简单有效。但如果需要并行处理其他任务,非阻塞方式可能更合适,尽管需要一些轮询检查是否有数据到达。选择哪种方式取决于你的应用场景和要求。

让我们以一个简单的嵌入式系统中使用串口通信的场景为例,说明两者的应用场景。

场景:

假设你的嵌入式系统中有一个传感器通过 UART 接口发送数据给微控制器,你需要读取这些数据并进行处理。

使用 uart_read_byte(UART_INDEX)

void main()

{

char received_data;

// 循环等待串口数据,并处理

while (1)

{

received_data = uart_read_byte(UART_INDEX);

// 在这里可以对接收到的数据进行处理

process_data(received_data);

}

}

在这个例子中,uart_read_byte 是一个阻塞式的调用,它会一直等待串口中有数据可读。程序会停留在这个地方,直到有数据到达。这适用于实时性要求不高,而且串口接收是主要的任务的情况。

使用 uart_query_byte(UART_INDEX, &get_data)

void main()

{

char received_data;

// 循环查询串口是否有数据,并处理

while (1)

{

if (uart_query_byte(UART_INDEX, &received_data))

{

// 如果有数据,处理

process_data(received_data);

}

// 在这里可以执行其他任务,不会被阻塞

do_other_tasks();

}

}

在这个例子中,uart_query_byte 是一个非阻塞的调用。如果串口中有数据可读,它会将数据存储在 received_data 中并返回 true,然后程序可以处理数据。如果没有数据可读,它会立即返回 false,程序可以继续执行其他任务。这适用于需要并发执行其他任务或对实时性有较高要求的情况。

这两种方式的选择取决于你的应用需求。如果你的应用主要是接收串口数据,并且对实时性要求不高,可以选择使用阻塞式的方式。如果需要并发执行其他任务或对实时性要求较高,可以选择使用非阻塞的查询方式。