//-------------------------------------------------------------------------------------------------------------------
// 函数简介 读取串口接收的数据(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,程序可以继续执行其他任务。这适用于需要并发执行其他任务或对实时性有较高要求的情况。
这两种方式的选择取决于你的应用需求。如果你的应用主要是接收串口数据,并且对实时性要求不高,可以选择使用阻塞式的方式。如果需要并发执行其他任务或对实时性要求较高,可以选择使用非阻塞的查询方式。