Other Parts Discussed in Thread: CC2530
向串口发送3个字节,HAL_UART_RX_TIMEOUT事件能正常触发,发送47个字节时反而不能触发HAL_UART_RX_TIMEOUT事件?
这是什么回事?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
原版代码:
if (cnt >= HAL_UART_DMA_FULL)
{
evt = HAL_UART_RX_FULL;
}
else if (cnt >= HAL_UART_DMA_HIGH)
{
evt = HAL_UART_RX_ABOUT_FULL;
PxOUT |= HAL_UART_Px_RTS; // Disable Rx flow.
}
else if (cnt && !dmaCfg.rxTick)
{
evt = HAL_UART_RX_TIMEOUT;
}
HAL_UART_DMA_RX_MAX = 64,波特率115200
原版的代码如果发送的字节大于等于(HAL_UART_DMA_RX_MAX / 2 - 16)是不能触发超时事件的,如果在串口回调函数中对HAL_UART_RX_ABOUT_FULL或者HAL_UART_RX_FULL进行处理并调用HalUARTRead();读取串口数据,那么很有可能读到的数据是不完整的,例如你发的字节数是32,那么在CC2530收到(HAL_UART_DMA_RX_MAX / 2 - 16)个字节时就会触发HAL_UART_RX_ABOUT_FULL事件,这时候在回调函数读取串口数据,你读到的字节数是>=(HAL_UART_DMA_RX_MAX / 2 - 16),剩下的如果少于(HAL_UART_DMA_RX_MAX / 2 - 16)就会触发HAL_UART_RX_TIMEOUT事件,>=(HAL_UART_DMA_RX_MAX / 2 - 16)就会触发HAL_UART_RX_ABOUT_FULL,一直这样循环下去,所以收到的数据时分段的,18+14=32或者20+12=32这样,因为在32MHz晶振的时候CC2530速度比较快,而115200的波特率比较慢,所以在产生HAL_UART_RX_ABOUT_FULL事件时就读取数据时是不能触发HAL_UART_RX_FULL事件的。
将代码改为:
if (cnt >= HAL_UART_DMA_FULL)
{
evt = HAL_UART_RX_FULL;
}
else if (cnt >= HAL_UART_DMA_HIGH)
{
evt = HAL_UART_RX_ABOUT_FULL;
PxOUT |= HAL_UART_Px_RTS; // Disable Rx flow.
}
if (cnt && !dmaCfg.rxTick)
{
evt = HAL_UART_RX_TIMEOUT;
}
这样的话HAL_UART_RX_TIMEOUT和HAL_UART_RX_ABOUT_FULL都可以发生,而且在回调函数只判断HAL_UART_RX_TIMEOUT事件就可以把数据一次读出来。