对单片机通信方式(中断和轮询)的理解

        在了解单片机和外设通信的时候,我们不仅要了解通信的协议,我们通信的方式。其中通信协议就像是我们说话的语法,如果语法错了,那么外设就一个字听不懂了;如果通信方式错了,外设就可能就理解不了我们说话的意思了。

      在我学习51单片机的时候,一些资料说通信的方式有两种,分别是中断和轮询,并且中断会占用更少的CPU资源。当时我看的似懂非懂就开始写(抄)程序。但是这个一定是对的吗?

      我们先谈谈单片机发送一个字节的数据。如果我们要连续每隔一段时间发送一个字节数据,我们首先就要向寄存器内写入我们想要发送的数据。然后单片机的硬件就会为我们完成数据的发送,并且在发送完成后产生中断!但是,我们已经发送完了我们想要发送的数据了,再次进入中断还有什么意义?所以我认为:在这种模式或者说是需求下,我们完全不必使用中断,只需要每间隔一段时间调用我们的发送函数(发送函数只需要完成写寄存器的指令就行了)便可以了。

        我们再来谈谈单片机接收一个字节的数据。在单片机接收完一个字节的数据后,会产生中断。如果对面传来的数据的时间间隔非常小,在我们单片机的处理能力跟不上的时候,我们也可以不必使用中断,只需要定时调用接收函数(接收函数只需要完成读取寄存器的值就行了)便可以了。当然这个时候,我们可能会造成一定的数据的丢失。当然我们也可以使用中断,这样就可以避免数据的丢失。但是,如果我们接收数据的速度大于我们处理数据的速度时,我们还是会产生丢失数据的情况。

        我们在来谈谈单片机发送一个数据包的情况。这就要求我们发送的数据的时间间隔非常小。(我没有遇到过这种情况,完全靠想象)。如果我们采用轮询的话,那么就需要完成判断是否发送完成发送这一个动作,我的理解是这样就会占用CPU的资源,这个动作也会消耗一定的时间,但是我认为这个时间应该是可以忽略的。所以我们如果采用中断的话,我们就可以完成一次发送一个数据包的需求了。

        最后,我们来谈谈单片机接收一个数据包的情况。如果一个数据包内的数据发送时间间隔是非常非常小的话,采用轮询的方式必然会产生一个判断的时间。如果判断的时间大于发送时间间隔的话,那么就很可能产生下一帧数据接收不成功的情况,这个是属于寄存器里没有写入数据,我们无法在后续的程序里来弥补这个错误。所以当然是中断方式比较好啊。当然还用一种叫做FIFO的结构,应该对这种情况有所帮助,但是我没有接触了解使用过,也就整不明白了。

        以上都是我自己个人的理解或者说是猜想吧,也没有得到过验证,也都是从我少的可怜的、失败的尝试中总结出来的。不够准确,不够专业,但也是我“智慧”的结晶啊,不写出来总觉得对不起每天脖子上面顶着的那个玩意。

        

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值