在使用STM32446E-NUCLEO板卡调试程序进行串口打印输出的时候遇到了问题,电脑接收数据的时候丢失第一个字节。比如串口输出“AABBCCDD”到电脑端显示则为“ABBCCDD”。
如下图所示:
电脑串口终端使用的是secureCRT,开始以为是电脑端串口配置错误,于是将波特率、流控、奇偶校验什么的全改了一个遍也没有解决问题,后来仔细研究了下数据手册,发现问题出在发送接收完成的标志位上。
看数据手册时,有这么一段话,
发送完成标志位TC 0:发送还未完成;1:发送完成。
当包含有数据的一帧发送完成后,由硬件将该位置位。如果USART_CR1中的TCIE为1,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。TC位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。
在硬件复位后,TC标志位为1,串口发送的首个数据之前没有read SR的操作,是直接write DR,也就是说,TC没有被清除掉,此时执行串口发送函数时会误将第一个字节判断为已经发送完成,从而跳过了第一个字节的发送。
因此,为了解决这个问题,我们可以在发送第一个字节之前先判断下标志位,等待其清零。
然后再发送第二个字节数据。
看下图的串口发送函数:
如图所示,在串口发送函数中,我注释掉红框里面的语句就会发生丢失第一个字节的错误,如果取消注释,即是,在发送第一个字节之前先读一次TC标志位使其清零。
修改之后运行如下图所示:问题解决
工程文件有点大,程序放网盘里了,方便大家下载测试。
没有权限发链接,就这么发网址吧 链接://pan.baidu.com/s/1gdhlEkN 密码:0kqi
|