单片机串口通信时,在串口初始化之前要加延时吗?

时间:2021-11-04 19:48:46
   各位高手:我们编了一个串口通信程序,当串口初始化前不加延时的时候  ,发送的数据与接收的数据正好错一位。
加上之后就好了,这是为什么?大哥们帮我解决一下下!谢啦谢啦!
   

18 个解决方案

#1


一般不需要,只是在切换或启动晶振后需要一下,你这个不知道原因

#2


在发送后需要加上一个延迟,因为通信都是需要消耗时间的。延迟后可以等待通信的完成。

#3


需要将缓冲区里面的数据移位到输出口 否则读出的是上次的数据

#4


需要将缓冲区里面的数据移位到输出口 否则读出的是上次的数据

#5


一般的串口发送字节函数 都会有一个发送完毕等待的过程。例如:MSP430的就是是
while (!(IFG2 & UCA0TXIFG)) ;楼主还是根据自己MCU型号,找相关例程比对一下吧。

#6


一般不需要,只是在切换或启动晶振后需要一下

#7


不需要。

#8


引用 7 楼  的回复:
不需要。

++

我理解错LZ的意思了

#9


引用 7 楼  的回复:
不需要。


++

从没发现lz 的情况,用的什么串口?

#10


单片机处理数据的速度太快,最好加一点delay,保证通信正常

#11


应该有特殊的寄存器,用while判断一下晶振是否稳定。
稳定之后在发数据。

#12


加上之后就好了,这是为什么?大哥们帮我解决一下下!谢啦谢啦!

感觉这个可能是该芯片的串口有两级缓冲的原因

第一级缓冲是供单片机读写的

第二级是用于通信的。

在第二级缓冲完成通信,串口会根据第一级缓冲是不是空来选择产生的中断

如果,通信完成,缓冲为空,会产生通信完成中断

如果通信完成,缓冲不为空,会把第一级缓冲中的数据送入第二级,进行通信,同时产生的是缓冲为空的中断

LZ可能是都用缓冲为空中断进行处理,其实缓冲为空的时候,通信才刚刚开始,如果这个时候恢复了总线上的状态(如485中的收和发切换)就会造成通信错误,最后一个字节丢失

所以在应用上,通常要对最后一个字节等待的中断标志进行更换

#13


感觉是程序的BUG吧,好好看看程序!

#14


不需要

#15


我以前也遇到过,串口初始化之前,也就是单片机刚开始执行代码时,需要延时以后,再初始化UART,才能正确收发数据

也没找问题到底出在哪,可能是晶振吧,不确定

#16


你是不是刚一上电就去初始呀,

#17


恩,貌似是晶振的问题,换了一个晶振就好了。谢啦

#18


引用 17 楼  的回复:
恩,貌似是晶振的问题,换了一个晶振就好了。谢啦

你在串口初始化前是不是有做时钟源调整?如果是的话最好做一定的延迟用来等待振荡器稳定。

#1


一般不需要,只是在切换或启动晶振后需要一下,你这个不知道原因

#2


在发送后需要加上一个延迟,因为通信都是需要消耗时间的。延迟后可以等待通信的完成。

#3


需要将缓冲区里面的数据移位到输出口 否则读出的是上次的数据

#4


需要将缓冲区里面的数据移位到输出口 否则读出的是上次的数据

#5


一般的串口发送字节函数 都会有一个发送完毕等待的过程。例如:MSP430的就是是
while (!(IFG2 & UCA0TXIFG)) ;楼主还是根据自己MCU型号,找相关例程比对一下吧。

#6


一般不需要,只是在切换或启动晶振后需要一下

#7


不需要。

#8


引用 7 楼  的回复:
不需要。

++

我理解错LZ的意思了

#9


引用 7 楼  的回复:
不需要。


++

从没发现lz 的情况,用的什么串口?

#10


单片机处理数据的速度太快,最好加一点delay,保证通信正常

#11


应该有特殊的寄存器,用while判断一下晶振是否稳定。
稳定之后在发数据。

#12


加上之后就好了,这是为什么?大哥们帮我解决一下下!谢啦谢啦!

感觉这个可能是该芯片的串口有两级缓冲的原因

第一级缓冲是供单片机读写的

第二级是用于通信的。

在第二级缓冲完成通信,串口会根据第一级缓冲是不是空来选择产生的中断

如果,通信完成,缓冲为空,会产生通信完成中断

如果通信完成,缓冲不为空,会把第一级缓冲中的数据送入第二级,进行通信,同时产生的是缓冲为空的中断

LZ可能是都用缓冲为空中断进行处理,其实缓冲为空的时候,通信才刚刚开始,如果这个时候恢复了总线上的状态(如485中的收和发切换)就会造成通信错误,最后一个字节丢失

所以在应用上,通常要对最后一个字节等待的中断标志进行更换

#13


感觉是程序的BUG吧,好好看看程序!

#14


不需要

#15


我以前也遇到过,串口初始化之前,也就是单片机刚开始执行代码时,需要延时以后,再初始化UART,才能正确收发数据

也没找问题到底出在哪,可能是晶振吧,不确定

#16


你是不是刚一上电就去初始呀,

#17


恩,貌似是晶振的问题,换了一个晶振就好了。谢啦

#18


引用 17 楼  的回复:
恩,貌似是晶振的问题,换了一个晶振就好了。谢啦

你在串口初始化前是不是有做时钟源调整?如果是的话最好做一定的延迟用来等待振荡器稳定。