新闻中心

RS485协议

作者: 时间:2016-12-14 来源:网络 收藏

第二步:发送数据

本文引用地址: //m.amcfsurvey.com/article/201612/330004.htm

这里需要注意的是:

方法一:USART_ClearFlag(USART3, USART_FLAG_TC);

方法二:

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
  1. #defineRX_485GPIO_SetBits(GPIOA,GPIO_Pin_1);
  2. #defineTX_485GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  3. voidUART2_TX485_Puts(char*str)
  4. {
  5. while(*str)
  6. {
  7. TX_485;//打开485发送DE端口,关闭接收/RE端口
  8. DelayNmS(1);
  9. USART_SendData(USART2,*str++);
  10. while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//检测发送数据寄存器空标志位
  11. DelayNmS(1);
  12. RX_485;//关闭发送DE端口,打开接收/RE485端口,
  13. }
  14. }style="font-family:TimesNewRoman;font-size:14px;"> span>

在485芯片的通信中,尤其要注意对485控制端DE的软件编程。为了可靠工作,在485总线状态切换时需要做适当延时,再进行数据收发。具体的做法是在数据发送状态下,先将控制端置“1”,延时1ms左右的时间,在发送有效的数据,一包数据发送结束后再延时1ms后,将控制端置“0”,这样处理会使总线在状态切换时,有一个稳定的工作过程。



上一页 1 2 下一页

关键词:RS485协议通信总线自动仲

评论


相关推荐

技术专区

关闭