3、发数据过程
(1)用户把TI置1
(2) 系统产生中断,内核轮询到TI为1,跳转至串口中断服务函数
(3) 用户把1byte要发的数据装载至SBUF
(4)硬件发送器发送数据,发送完成自动把TI置1
(5)系统产生中断,重复(2)~(4)
(6) 当用户不再往SBUF装数据时,发送数据过程结束
发数据也是1byte 1byte发,每1byte先产生中断再装载数据。
数据流向过程如下图:
又如果,串口中断服务函数里面太长,前一次还没处理完,新的中断又到了,就会自己耽误自己。
4、当前数据还没发完,用户又把新数据装到我的SBUF中
我的硬件在发数据,此时TI已经被用户程序清0了,
如果程序员逻辑不够清晰,马上又要发一包新数据,把TI置1 了,那么CPU会马上进入中断服务函数,中断服务函数马上会把新的1byte 数据装到我的SBUF里,我刚刚正在发的那1byte 数据还没发完就被新数据覆盖弄丢了。
解决:程序串口驱动层接口发数据前,先判断当前是否处于发送数据过程中,若正在发送过程中,不用再将TI置1.
5、 我们这里总中断关了,对方还发数据给我
总中断关了,对方给我发数据,我的硬件还是能收到数据的,我也会把RI置1,但是此时就不会产生中断,不会进入中断服务函数了,如果对方马上又给我发了新的1byte数据,用户这时还是没有把总中断打开,刚刚那1byte数据还在SBUF中会被新来的数据覆盖,用户没取走丢掉了。
解决:对方增加重发逻辑。
6、我硬件能力不够,收发速度跟不上
用户竟然选择了系统时钟才2M,我的波特率却被设置成了115200这么大,
此时我的波特率发生器产生的波特率已经不能达到115200了,数据还是能1byte 1byte的发出去,只是就是发出去的数据电平的长度可能不对了,
标准串口每1byte数据 = 1bit起始位+ 8bit数据位+奇偶校验位(1或1.5或2或无)+停止位(1bit),起始电平是低电平,无数据时是高电平。
1.外媒谈英伟达-Arm并购案~
2.这里聚焦了全球嵌入式技术风景~
3.航天器、导弹喜欢用单片机/p>
4.工程师的硬核单片机编程思想~
5.嵌入式开发需要架构设计吗/p>
6.【技术转管理必备】嵌入式产品的研发流程

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91513 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!