单片机串口通信时,在串口初始化之前要加延时吗?
各位高手:我们编了一个串口通信程序,当串口初始化前不加延时的时候 ,发送的数据与接收的数据正好错一位。
加上之后就好了,这是为什么?大哥们帮我解决一下下!谢啦谢啦!
[解决办法]
一般的串口发送字节函数 都会有一个发送完毕等待的过程。例如:MSP430的就是是
while (!(IFG2 & UCA0TXIFG)) ;楼主还是根据自己MCU型号,找相关例程比对一下吧。
[解决办法]
应该有特殊的寄存器,用while判断一下晶振是否稳定。
稳定之后在发数据。
[解决办法]
加上之后就好了,这是为什么?大哥们帮我解决一下下!谢啦谢啦!
感觉这个可能是该芯片的串口有两级缓冲的原因
第一级缓冲是供单片机读写的
第二级是用于通信的。
在第二级缓冲完成通信,串口会根据第一级缓冲是不是空来选择产生的中断
如果,通信完成,缓冲为空,会产生通信完成中断
如果通信完成,缓冲不为空,会把第一级缓冲中的数据送入第二级,进行通信,同时产生的是缓冲为空的中断
LZ可能是都用缓冲为空中断进行处理,其实缓冲为空的时候,通信才刚刚开始,如果这个时候恢复了总线上的状态(如485中的收和发切换)就会造成通信错误,最后一个字节丢失
所以在应用上,通常要对最后一个字节等待的中断标志进行更换