首先,我想给这两种方法一个较为“贴切”的定义,对于
FIFO处理方法,一般称之为“异步双缓冲”;对于第二种方法,则称为“即时状态处理”

对于“异步双缓冲”方法来说,其根本思想是占用最小的系统时间完成数据的接收,而
处理部分及其实时性的保证则由其他任务(裸机模式下主循环中的任务或者操作系统模
式下某个对应的任务)来处理。这种情况下,串口被作为一种资源,中断处理程序负责
简单的采集资源,采集的过程与实际应用是剥离的。应该说,异步双缓冲模式的耦合度
最小,因此对于资源的消费者来说,资源采集自何方,如何采集并不重要,是透明的。
因而符合系统模块化的需求。从实时性的角度来说,资源的采集事件是一个实时性要求
较高的事件,但是资源的处理往往并不紧急,因此在一个紧急的采集事件中做不那么紧急
的数据处理,实在是一种不明智的选择。因此,在大多数情况下,异步双缓冲模式是一个
值得推荐的方法。

但是,当我们说“大多数情况”这样的限定时,往往存在较为特殊的情形。这也就是即时
状态处理大显身手的状况:即:数据采集是紧急事件,数据的处理也是紧急的事件。或者
数据的处理本身由紧急的前期处理和非紧急的后期处理两部分组成。或者数据的采集本身
是受到控制的,即采集的过程是紧急的,数据的处理分为紧急和非紧急两部分,但是如果
不处理完,就不会继续采集资源——对于这种情况,通常将数据的处理放在数据采集中,
因为分开反而意义不大。据一个例子:上位机发送给下位机的数据是存在某种简单的帧结构
的,而这一帧结构对于数据处理程序来说“必须是透明的”——也就是说,数据处理程序
需要的是帧结构里面的一部分数据(也就是帧所包装的内容),那么,我们说,这类情况下
数据的采集是紧急的,桢解析如果本身不复杂,也可以诗作允许放在紧急任务中处理的,而
解宝以后的数据,则可以放到FIFO中,留给主循环慢慢享用——当然你要说,如果我全部用
FIFO接收下来,然后主循环做一个任务来解包不也可以么?这还是有区别的,因为帧的作用
就是包装数据,如果通讯环境不稳定,帧容易出错,或者帧之间有其它数据(比如某些总线
环境下,复合帧传输)那么,无用的数据就会给FIFO以及系统任务带来负担;如果在资源采集
的时候花费较小的代价进行简单的数据提取(过滤),比如,等待帧头部,否则所有数据丢弃,
则可以大大降低系统综合的开销。

综上所述,要根据具体的系统要求,选取其一,或者综合。简单的下结论都是不好的。选择的
原则,就是要搞清楚,哪些任务是紧急的,哪些不是。避免在紧急事件处理程序中做不紧急的
事情。如果资源处理程序某些部分紧急,某些部分次要,那么应该尝试分为两个子任务。