STM32菜鸟成长记录---RS485通讯协议的应用(2)
- UID
- 1029342
- 性别
- 男
|
STM32菜鸟成长记录---RS485通讯协议的应用(2)
第二步:发送数据
这里需要注意的是:
/* 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的方向为接收.
[html] view plaincopy
- /*****************************************************************
- * 宏定义
- ******************************************************************/
- #define RX_485 GPIO_SetBits(GPIOA,GPIO_Pin_1);
- #define TX_485 GPIO_ResetBits(GPIOA,GPIO_Pin_1);
- /*****************************************************************
- *函数名称: UART2_TX485_Puts
- *功能描述: 发送字符串数据
- *
- *输入参数:str:要发送的字符串
- *返回值:无
- *其他说明:无
- *当前版本:v1.0
- *作 者: 梁尹宣
- *完成日期:2012年8月3日
- *修改日期 版本号 修改人 修改内容
- *-----------------------------------------------------------------
- *
- ******************************************************************/
- void UART2_TX485_Puts(char * str)
- {
- while(*str)
- {
- TX_485; //打开485发送DE端口,关闭接收/RE端口
- DelayNmS(1);
- USART_SendData(USART2, *str++);
- /* Loop until the end of transmission */
- while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); //检测发送数据寄存器空标志位
- DelayNmS(1);
- RX_485; //关闭发送DE端口,打开接收/RE485端口,
- }
- }<span
style="font-family:Times New Roman;font-size:14px;">
</span>
在485芯片的通信中,尤其要注意对485控制端DE的软件编程。为了可靠工作,在485总线状态切换时需要做适当延时,再进行数据收发。具体的做法是在数据发送状态下,
先将控制端置“1”,延时1ms左右的时间,在发送有效的数据,一包数据发送结束后再延时1ms后,将控制端置“0”,这样处理会使总线在状态切换时,有一个稳定的工作过程。 |
|
|
|
|
|