UARTLite接收不定长数据
1. Vivado建立UARTLite的IP核工程
(不做介绍,过程略)
2. 创建SDK或vitis应用工程
(不做介绍,过程略)
3. 添加UARTLite官方例程xuartlite_intr_example
(不做介绍,过程略)
4. 编译、烧写,验证硬件是否OK
5. 分析官方例程
官方例程xuartlite_intr_example是打开中断,将发送引脚与接收引脚短接,如果接收的数据长度等于发送的数据长度,且接收数据等于发送数据,则例程运行正常。
例程中没有给出中断处理函数,而是给出了将自定义封装到发送完成或接收完成中断的函数。
寻找XUartLite_SetRecvHandler函数声明的位置,在xuartlite_intr.c中,
这个函数将用户函数送入了结构体中的RecvHandler中,在xuartlite_intr.c中寻找调用RecvHandler的函数,找到ReceiveDataHandler函数。
我们再看看谁调用了ReceiveDataHandler函数,原来是XUartLite_InterruptHandler函数,它应该就是xUARTLite的中断函数本尊了。
这个函数很简单,就是发生发动或接收中断,就调用对应的函数。接下来我们回到ReceiveDataHandler函数。
这个函数可以分为三部分:
第一部分,判断接收缓存剩余要接收的字节数是否为0(也就是是否接收到指定字节长度的数据)。
如果还没有达到指定长度,会跳到XUartLite_ReceiveBuffer函数,接收剩余字节,直到接收FIFO为空。(不管是否接收完毕)。
第二部分,判断接收数据缓存是否为0,如果为零,则调用用户自定义的中断函数RecvHandler,并将回调函数和已经接收到的字节长度发送到该中断函数。
第三部分,记录中断次数。
7. 修改官方源文件xuartlite_intr.c。
经过前边的介绍,我们可以知道只要修改ReceiveDataHandler函数的第二部分即可实现不定长数据的接收。修改方法为,将剩余字节数的判断去掉,直接执行用户中断函数RecvHandler的调用。
对于例程中给出的自定义函数,我们可以增加一个接收标志的置位,