C 语言串口读取函数 uartRead() 解释 - DMA 和普通模式

static uint8_t uartRead(serialPort_t *instance)
{
    uint8_t ch;
    uartPort_t *uartPort = (uartPort_t *)instance;

#ifdef USE_DMA
    if (uartPort->rxDMAResource) {
        ch = uartPort->port.rxBuffer[uartPort->port.rxBufferSize - uartPort->rxDMAPos];
        if (--uartPort->rxDMAPos == 0)
            uartPort->rxDMAPos = uartPort->port.rxBufferSize;
    } else
#endif
    {
        ch = uartPort->port.rxBuffer[uartPort->port.rxBufferTail];
        if (uartPort->port.rxBufferTail + 1 >= uartPort->port.rxBufferSize) {
            uartPort->port.rxBufferTail = 0;
        } else {
            uartPort->port.rxBufferTail++;
        }
    }

    return ch;
}

该函数 uartRead() 用于从串口接收缓冲区中读取一个字节的数据。

函数参数:

  • instance: 指向 serialPort_t 结构体的指针,包含串口相关信息。

函数内部逻辑:

  1. 获取 uartPort 指针: 根据 instance 获取对应的 uartPort_t 结构体指针 uartPort

  2. 根据 USE_DMA 选项选择读取模式:

    • DMA 模式 (USE_DMA 定义):

      • 使用 uartPort->rxDMAResource 检查是否启用了 DMA。
      • 从 DMA 接收缓冲区 uartPort->port.rxBuffer 中读取一个字节的数据,读取位置由 uartPort->rxDMAPos 指示。
      • 读取位置递减 1,如果减为 0,则重置为接收缓冲区大小 uartPort->port.rxBufferSize
    • 普通模式 (USE_DMA 未定义):

      • 从普通接收缓冲区 uartPort->port.rxBuffer 中读取一个字节的数据,读取位置由 uartPort->port.rxBufferTail 指示。
      • 更新接收缓冲区的尾指针 uartPort->port.rxBufferTail。如果尾指针达到缓冲区末尾,则重置为 0。
  3. 返回读取到的字节数据: 返回读取到的字节 ch

总结:

该函数通过判断 USE_DMA 选项,选择使用 DMA 或普通模式进行串口接收数据的读取操作。DMA 模式使用专门的 DMA 控制器进行数据传输,可以提高效率;普通模式则需要 CPU 直接进行数据读写。该函数的实现确保了串口数据读取的可靠性和效率。


原文地址: https://www.cveoy.top/t/topic/pD2v 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录