TI中文支持网
TI专业的中文技术问题搜集分享网站

Z-Stack 3.0.2 uart无法触发HAL_UART_RX_TIMEOUT事件?

向串口发送3个字节,HAL_UART_RX_TIMEOUT事件能正常触发,发送47个字节时反而不能触发HAL_UART_RX_TIMEOUT事件?

这是什么回事?

Viki Shi:

请提供更详细的信息,是大于3个字节就无法触发还是正好第47个字节无法触发?

Lord Over:

回复 Viki Shi:

HAL_UART_DMA_RX_MAX=64,改到128后没这个问题,应该是这个数值太小了

Lord Over:

回复 Viki Shi:

原版代码:

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事件就可以把数据一次读出来。

赞(0)
未经允许不得转载:TI中文支持网 » Z-Stack 3.0.2 uart无法触发HAL_UART_RX_TIMEOUT事件?
分享到: 更多 (0)