1. 背景介绍 项目中使用串口收发数据必然会遇到接收不定长数据的情况。串口接收数据大致可以分为以下几种: 1) 轮询的方式,通过不断检查串口接收缓冲区中是否有新的数据来实现接收。这种方式需要不断的查询串口缓冲区,系统资源利用率不高。 2) 中断的方式,使用串口接收中断来通知处理器有新的数据。这种方式比轮询方式更高效,让系统在有数据到达时立即做出响应,更契合嵌入式数据处理的理念。 3) DMA的方式,使用DMA传输,可以减轻处理起的负担,在处理大数据量的时候优势很明显。 在面对不定长数据接收的情况,很多芯片采用DMA+空闲中断的方式,确保及时接收并处理完整一帧数据。在PSoC6中我们可以通过使用 非空中断+DMA+Timer的方式实现不定长数据的接收。 2. 实现不定长数据处理的方法 1) 串口初始化:配置基本参数,注册回调函数,使能RX_Done/TX_Done/RX_Not_Empty 2) Timer初始化:重点为Timer周期配置为触发一次Rx_Done所需要的时间(例程中设置为64B触发RX Done中断,uart波特率为115200,所以周期配置为6ms(87us*64)) 3) 中断回调函数: a. RNE中断处理:关闭RNE中断,开启定时器 b. RX Done中断处理:计数值加1,拷贝数据 4) 定时器中断: 若两次进入中断,计数值未变,表示一帧数据接收完成,停止定时器 3. 代码实现 1) 串口初始化 2) Timer初始化 3) 中断回调 4) 定时器中断 4. 例程使用及注意事项 1) 因为使用Timer做空闲判断处理,所以两帧数据包之间的间隔要小于Timer的周期,否则会导致误判 2) 该例程基于MTB3.1和CY8CKIT-062-WIFI-BT设计开发 3) 该例程功能为从串口获取数据,并打印完整一包数据,将例程烧写到板子后,通过串口发送任意长度的一帧数据,可以在接收窗口看到所发送的数据。
|