关于stm32的串口,为什么经常看见串口发送的第一个字节数据会丢失及解决办法
[复制链接]
搞指纹识别模块遇到的问题! 用串口调试助手发现每次发送出去的数据第一个字节都会丢失,后来研究发现:
1、串口的SR寄存器的复位值就是0x00c0,而我的程序是 /* 功能:串口发送 */ void Txd_Byte(u8 data) { USART1->DR=data; while((USART1->SR&0X40)==0); } 我判断的是TC位,就是说要等到数据到移位寄存器中完成后,再发送第二帧数据,但是,由于SR寄存器的复位值是0x00c0,所以首先TC位就是置1的,所以当第一次数据写入DR寄存器中的时候头一个while没起作用,然后第二个数据来了就把第一个数据覆盖了,这样我们经常发现,串口的第一个数据丢失了!
搞懂了为什么,这样解决问题就好办了! 最简单的办法就是直接判断TXE为,即把上面的0x40改成0x80就行; 第二个就是先读SR的TC位,这样第二次判断的时候,就已经清零了,只有等待数据到移位寄存器肿了,第二次数据来的时候就不会覆盖第一次的数据了
其实最好还是判断TXE位,当然,如果在多缓冲器的情况下,还是判断TC位比较好!
|