ZYNQ UARTLite接收不定长数据

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的中断函数本尊了。
UART中断处理函数

这个函数很简单,就是发生发动或接收中断,就调用对应的函数。接下来我们回到ReceiveDataHandler函数。
接收中断函数分析
这个函数可以分为三部分:

第一部分,判断接收缓存剩余要接收的字节数是否为0(也就是是否接收到指定字节长度的数据)。
如果还没有达到指定长度,会跳到XUartLite_ReceiveBuffer函数,接收剩余字节,直到接收FIFO为空。(不管是否接收完毕)。

第二部分,判断接收数据缓存是否为0,如果为零,则调用用户自定义的中断函数RecvHandler,并将回调函数和已经接收到的字节长度发送到该中断函数。

第三部分,记录中断次数。

7. 修改官方源文件xuartlite_intr.c。

经过前边的介绍,我们可以知道只要修改ReceiveDataHandler函数的第二部分即可实现不定长数据的接收。修改方法为,将剩余字节数的判断去掉,直接执行用户中断函数RecvHandler的调用。
接收中断函数修改

对于例程中给出的自定义函数,我们可以增加一个接收标志的置位,

自定义中断函数修改

8. 编译、烧写,测试功能。

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值