C 语言串口读取函数 uartRead() 解释 - DMA 和普通模式
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结构体的指针,包含串口相关信息。
函数内部逻辑:
-
获取 uartPort 指针: 根据
instance获取对应的uartPort_t结构体指针uartPort。 -
根据 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。
- 从普通接收缓冲区
-
-
返回读取到的字节数据: 返回读取到的字节
ch。
总结:
该函数通过判断 USE_DMA 选项,选择使用 DMA 或普通模式进行串口接收数据的读取操作。DMA 模式使用专门的 DMA 控制器进行数据传输,可以提高效率;普通模式则需要 CPU 直接进行数据读写。该函数的实现确保了串口数据读取的可靠性和效率。
原文地址: https://www.cveoy.top/t/topic/pD2v 著作权归作者所有。请勿转载和采集!