4 个基本测量单元上的STM32F103ZET6 片内RAM 中开辟了8kB 循环FIFO 作为串口1的发送缓冲区。在数据打包单元上的STM32F103ZET6 片内RAM 中开辟了32kB 循环FIFO作为串口2 ~5 接收4 个基本测量单元串口所发送的数据及其串口1 上传数据的公共缓冲区。为了尽量避免数据缓冲区溢出引发的串口通信处理异常的问题,将数据收发缓冲区设计成一个循环队列(张飙等,2011;刘军等,2013)。
图6-10 IrFlag 中断程序工作流程图(周国清等,2015)
该循环FIFO 设置有读写两种类型的指针。每当FIFO 中有一个数据被写入或者被读走,对应的写或者读指针就沿数据缓冲区指向下一位。判别循环FIFO 是空或者已满的状态极其方便,图6-11 中的语句组摘自基本测量单元STM32F103ZET6 串口1 发送中断服务程序,其中SEND_BUF_SIZE=8192,即循环FIFO 大小为8kB,Scom1 定义了串口1 操作的结构体。(www.xing528.com)
图6-11 基本测量单元STM32F103ZET6 串口1 发送中断服务程序中部分语句组
第①句判断循环FIFO 是否为空,即判断读指针pRD_SendBuf 是否等于写指针pWR_SendBuf,如果相等则表示循环FIFO 为空,跳出该判断分支;如果不等则表示循环FIFO中有数据,随即执行第②句,从循环FIFO 读出1 字节送串口1 进行发送。第③句判断循环FIFO 读指针pRD_SendBuf 是否已经指向循环FIFO 的最后1 个单元,如果为真,则执行第④句调整读指针使其指向循环FIFO 的第1 个单元,覆盖已发送的测量数据,这就实现了FIFO 的循环操作,只要缓冲区大小设置合理,循环FIFO 中被覆盖的数据必定是已发送了的过时数据;如果第③句判断为假,则执行第⑤句,对读指针+1 使其指向循环FIFO 下一个待发送的数据单元。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。