1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
在了解单片机和外设通信的时候,我们不仅要了解通信的协议,我们通信的方式。其中通信协议就像是我们说话的语法,如果语法错了,那么外设就一个字听不懂了;如果通信方式错了,外设就可能就理解不了我们说话的意思了。
在我学习51单片机的时候,一些资料说通信的方式有两种,分别是中断和轮询,并且中断会占用更少的CPU资源。当时我看的似懂非懂就开始写(抄)程序。但是这个一定是对的吗? 我们先谈谈单片机发送一个字节的数据。如果我们要连续每隔一段时间发送一个字节数据,我们首先就要向寄存器内写入我们想要发送的数据。然后单片机的硬件就会为我们完成数据的发送,并且在发送完成后产生中断!但是,我们已经发送完了我们想要发送的数据了,再次进入中断还有什么意义?所以我认为:在这种模式或者说是需求下,我们完全不必使用中断,只需要每间隔一段时间调用我们的发送函数(发送函数只需要完成写寄存器的指令就行了)便可以了。 我们再来谈谈单片机接收一个字节的数据。在单片机接收完一个字节的数据后,会产生中断。如果对面传来的数据的时间间隔非常小,在我们单片机的处理能力跟不上的时候,我们也可以不必使用中断,只需要定时调用接收函数(接收函数只需要完成读取寄存器的值就行了)便可以了。当然这个时候,我们可能会造成一定的数据的丢失。当然我们也可以使用中断,这样就可以避免数据的丢失。但是,如果我们接收数据的速度大于我们处理数据的速度时,我们还是会产生丢失数据的情况。 我们在来谈谈单片机发送一个数据包的情况。这就要求我们发送的数据的时间间隔非常小。(我没有遇到过这种情况,完全靠想象)。如果我们采用轮询的话,那么就需要完成判断是否发送完成发送这一个动作,我的理解是这样就会占用CPU的资源,这个动作也会消耗一定的时间,但是我认为这个时间应该是可以忽略的。所以我们如果采用中断的话,我们就可以完成一次发送一个数据包的需求了。 最后,我们来谈谈单片机接收一个数据包的情况。如果一个数据包内的数据发送时间间隔是非常非常小的话,采用轮询的方式必然会产生一个判断的时间。如果判断的时间大于发送时间间隔的话,那么就很可能产生下一帧数据接收不成功的情况,这个是属于寄存器里没有写入数据,我们无法在后续的程序里来弥补这个错误。所以当然是中断方式比较好啊。当然还用一种叫做FIFO的结构,应该对这种情况有所帮助,但是我没有接触了解使用过,也就整不明白了。 以上都是我自己个人的理解或者说是猜想吧,也没有得到过验证,也都是从我少的可怜的、失败的尝试中总结出来的。不够准确,不够专业,但也是我“智慧”的结晶啊,不写出来总觉得对不起每天脖子上面顶着的那个玩意。 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9055 浏览 16 评论
4086 浏览 18 评论
1175浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 00:18 , Processed in 1.119388 second(s), Total 78, Slave 59 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号