首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32菜鸟成长记录---RS485通讯协议的应用(2)

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”,这样处理会使总线在状态切换时,有一个稳定的工作过程。
继承事业,薪火相传
返回列表