欢迎来到天天文库
浏览记录
ID:42102877
大小:36.00 KB
页数:5页
时间:2019-09-08
《串口通讯数据处理算法分析与实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、串口通讯数据处理算法分析与实现关键字:循环缓冲区串口通讯据处理算法串口通讯串口数据处理1,应用背景分析在很多的实际工程应用中,通讯方式通常是RS232、RS485、I2C和SPI等等。这类接口都有一个共同的特点:按照字节流的方式来进行通讯,即每中断一次,表明成功传送或者接收一个字节。还有一些接口传输的是数据块,即一次传送或者接收多个字节,比如CAN、USB和以A网等等。CAN和USB通常一次传输儿十个字节,和字节流的方式类似。所不同的是,我们可以利用CAN和USB接口的一些优势,简化通讯协议和提高nJ'靠性。比如,CAN和USB都具有硬件校验的功能,
2、那么我们就不需要在通讯协议中增加校验域。CAN网具有冲突检测和白动重传的功能,那么我们可以很容易的实现多点对多点通讯,相比之下,RS485适合做一点对多点的通讯,要实现多点对多点通讯比较麻烦,需要解决冲突检测问题口动重传等问题。而以太网一次可以传输1K多个字节。由于以太网有专门的TCP/IP协议栈來处理,这里我们不讨论。按字节方式域小数据块方式(CAN和USB)通讯的接口,不同之处在于:一次接收的数据长度不一样。为了提高算法的通用性,我们应该抽象这些硬件接口的不同,也就是说,我们应该屏蔽不同接口之间的差异。对于的数据处理程序来说,它町以认为这类的接口
3、传过来的是字节流,也就是一串数据。这里指的USB接口是指嵌入式设备的USB做从口来实现和主机通讯的情况。2字节流通讯协议的一般格式字节流通讯协议一般包含这样儿个域:前导码+帧长度+帧号+数据域+校验实际的通讯协议需耍定义各个域的长度和每一个bit的确切的含义。冇的通讯协议将帧长度放在帧号的后面。3字节流数据处理算法的实现我们先看看什么是循环FIFO缓冲区。FIFO缓冲区是具有先进先出功能的缓冲区。可以使用如下结构体來定义:TypedefStructBuffer_t{Inthead;Inttail;Chardata[BUFFER_LENJ;{Buffe
4、r;这个结构体非常简单,head记录缓冲区的头,tail记录缓冲区的尾,da"用來存放数据。在对head和"订修改时,需要对BUFFER_LEN取模,防止溢出o缓冲区的有效数据长度可以这样计算:(tail+BUFFERLEN-l-head)%BUFFERLEN。在这个结构体的基础上,按照FIFO的方式实现缓冲区的初始化、写入和读出3个函数,也就实现了FIFO缓冲区。循环缓冲是指当数据写到最后一个data中的元素后,紧接着再应该写入到data的第0个元素,将线性的缓冲区变成一个回环。当进行写入和读出时,数据在这个循环缓冲区中移动,屏蔽内部操作的细节。实
5、现算法时,需要注意以下几点:1,缓冲区空和满的判断条件:当head和"订相等的时候,缓冲区空,而当缓冲区中已经写入了BUFFER_LEN・1个数据时,缓冲区满。为什么不写入BUFFER_LEN个数据呢?因为写入BUFFER_LEN个数据后,head和tail相等,这就无法判断缓冲区是空还是满。2,写入和读出的策略当读取或者写入缓冲区时,需要检查缓冲区中的数据或者空间是否足够。在读取时,如果没有足够的数据,是读取己有的数据还是不读取任何数据,而在写入吋,如果空间不够,是部分写入还是不写入任何数据,这取决于你的应用。一般情况下,在空间不够时,町以不做任何
6、操作。当出现上述情况,留给上层的程序去处理。在实际应用中,如果读取和写入的程序设计的合理,缓冲区的人小合适,一般是不会出现写入失败的情况的。另外一个编程的细节是,对于数组的操作,一定耍小心数组越界的情况。千万千万要严格检查,否则,在调试的时候,他可能让你郁闷很长时间。你可能早就想问,为什么要使用循环缓冲区呢?不着急,咱们來慢慢分析。了解了字节流设备的底层细节,也了解了字节流设备的一般协议格式,还知道了循环FIFO缓冲区的原理和实现方法,我们不难看出,缓冲区具有如下的优点:1,对于上层函数,抽象了对硬件接口的操作细节,捉高了可移植性。简单一点说,就是将
7、上层函数和底层驱动(实际完成接口操作的函数)之间通过循环FIFO缓冲连接起來。当底层的接口由RS232换成CAN或者USB等等接口时,对通讯协议处理的上层的算法不用改动,只需要改动底层的驱动,将接收的数据正确的放入缓冲区或者将缓冲区中要发送的数据发送出去就可以了。2,使用循环缓冲区,可以非常方便的实现:前导码的搜索,错误包的处理前导码的搜索:前导码通常位于一个有效数据包的前端,因此,对循环缓冲区实现一个scan函数,完成对接收缓冲区中前几个数据的浏览功能,即只是查看(复制出來),不从缓冲区小读出。假设我们的前导码是:0xA5,0x5A,0xA5,0x
8、5A,处理前导码的搜索可以这样:每次从缓冲区中scan出4个字节,与前导码比较,如果相同,则搜索成功,如果不
此文档下载收益归作者所有