第二步:发送数据 这里需要注意的是: /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去 如下两个方法语句解决第1个字节无**确发送出去的问题 */ 方法一:USART_ClearFlag(USART3, USART_FLAG_TC); /*清发送完成标志,Transmission Complete flag */ 方法二:/*获取串口1状态标志位*/ USART_GetITStatus(USART1, USART_FLAG_TC); 刚上电时出现乱码的原因: while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); // USART_FLAG_TXE---检测发送数据寄存器空标志位 如果USART_FLAG_TC---发送完成标志位 (1) 当设为USART_FLAG_TXE---检测发送数据寄存器空标志位—为空,但是发送移位寄存器不为空,数据还没有完全的发送出去,又有数据就被写进来了,所以就会容易出现乱码; (2) 当设为USART_FLAG_TC—检测发送完成标志位—为空,即发送移位寄存器为空,数据才真正的发送出去,因此此时又有数据被写进来也不会发生乱码
STM32的数据发送有两个中断标志,一个是发送数据寄存器空标志,一个是发送完毕标志。两个标志都可以引起中断. 要以中断的方式发送一个数据包,流程是这样的: 1.设置RS485的方向为发送,使能发送寄存器空中断,使能完毕进入串口中断。 2.串口中断里读取串口状态,并填充一个数据到发送数据寄存器,硬件自动清除发送数据寄存器空标志,串口数据发送开始。 3.串口发送完一个数据,发送数据寄存器变空,再进入中断,继续填充下一个数据,直到最后一个数据填充完,使能串口 发送完毕中断。 4.最后一个数据发送完毕,再次进入中断,清除发送数据寄存器空标志,清除发送完毕中断标志,清除这两个中断标志 的使能位,设置RS485的方向为接收.
|