无论是串口还是SPI口,作为通信接口有多种处理方式,没有说timeout和定长接收或者中断中处理一定是哪种好,也分场合,小结了一下有这么几种做法:
1.轮询,收到一个字节处理一个字节,每个字节的处理可以用一个状态机。这种处理方法适合于低速、ram较小的通信场合。
2.中断,在中断中直接处理每个字节的内容。这种方法适合于低速、ram较少的通信场合。
3.中断,数据存入软件的fifo队列,应用层通过读取软件的fifo来实现串口操作。这种方法适合于低速,ram足够的场合,且每帧具有固定的帧长度,或帧长度可以从固定长度的帧头获取。
4.DMA,每次接收定长数据。适合于高速通信,ram足够的场合,且每帧具有固定的帧长度,或帧长度可以从固定长度的帧头获取。(需要注意的是当帧由于某种原因一直没有接收满时,程序是否会死等在那里。说白了还是需要一个超时功能来保证程序的可靠性)
5.第一个字用中断,开启DMA接收剩余数据,并开启定时器。(这么做第一个字节之后可能会丢失一部分数据)。这种方法适合用在有前导字节的通信帧中,且需要整帧接收处理的情况下,适合处理传输速度较快的通信,占用cpu较少。
6.DMA+接收结束判断。这接收结束判断可以是字节的timeout,也可以是USART_IT_IDLE线路空闲的标志等。这种方式对于需要整帧接收,且通信速度较快或需要占用cpu较少的情况。
7.硬件fifo+接收结束判断。每次fifo到达阀值在终端中取一次数据,当超时时标示收完一帧。用于需要整帧接收,且通信速度较快或需要占用cpu较少的情况。
这里罗列了一些我能想到的用法。主要分3种用途:1.字节处理;2.规定长度的帧处理;3.不规定长度整帧处理。
如果你的通信协议能得到一帧数据长度的,为什么非得强求fifo或dma的TimeOut的方式呢?如果你本身就只有那么点内存资源的,为什么不用字节处理要用其它方式呢?当然,无论如何,为了程序健壮性,设置一个超时还是必要的。没有其他办法就用定时器做。