RS485的缺点:

RS485总线是常规的通信总线,不能自动做总线仲裁,即不能同时发送数据以避免总线竞争,所以整个系统的通信效率必然较低,数据冗余较大,不适合对速度要求高的应用。同时,由于RS485总线上通常只有一台主机,这种总线模式是典型的集中-分散控制系统。一旦主机出现故障,整个系统的通信将限于瘫痪,因此对主机进行在线备份是一项重要措施。

* *传统光电隔离的典型电路:

VDD和5V1(VCC485)是两组不接地的电源,一般用隔离的DC-DC来实现。信号的隔离传输是通过光耦隔离实现的。ISL3152EIBZ与单片机系统不共,完全隔离有效抑制了高共模电压的产生,大大降低了485的损坏率,提高了系统的稳定性。但存在电路体积过大、电路复杂、分立器件过多、传输速率受光电器件限制等缺点,对整个系统的稳定性也有一定影响。

***RXD1:串行端口接收器

***TXD1:串口传输结束。

***TRE1:是控制位;控制是否发送或接收数据;

当TRE1=1(高电平)时,光耦电路121关断,/RE=1(无效),DE=1(有效),即发送数据;

当TRE=0(低电平)时,光耦电路导通,/RE=0(有效),即接收到数据,DE=0(无效);

/RE: 485接收器

DE:485变送器

步骤1,配置串口收发引脚和485控制引脚;

因为RXD1引脚接收相对于STM32芯片的外来数据,所以设置为输入;

与STM32芯片相比,TXD1引脚对外发送数据,因此设置为输出。

TRE1引脚用于发送“1”或“0”高低电平命令,所以设置为输出;

第二步:发送数据。

这里应该指出的是:

方法一:usart _ clear标志(usart3,usart _ flag _ TC);

方法2:

USART_GetITStatus(USART1,USART _ FLAG _ TC);

刚开机就出现乱码的原因:

while(USART _ GetFlagStatus(USART 2,USART _ FLAG _ TXE)==RESET);//usart _ flag _ txe—检测发送数据寄存器的空标志位。

if usart _ flag _ TC-传输完成标志位

(1)设置为usart _ flag _ txe时——检测发送数据寄存器为空的标志位——为空,但发送移位寄存器不为空,数据还没有完全发出就被写入,容易出现乱码;

(2)当usart _ flag _ TC——检测传输完成的标志位——为空时,即传输移位寄存器为空时,数据才真正发送出去,所以此时写入数据时不会出现乱码。

STM32的数据传输有两个中断标志,一个是传输数据寄存器的空标志,另一个是完成标志。两个标志都可能导致中断。

以中断方式发送数据包,过程如下:

1.设置RS485发送方向,使能发送寄存器空中中断,使能后进入串口中断。

2.读取串行端口中断中的串行端口状态,并将数据填入发送数据寄存器。硬件自动清除发送数据寄存器的空标志,串口数据发送开始。

3.串口发送一个数据后,发送数据寄存器变空,然后进入中断,继续填充下一个数据,直到填充完最后一个数据,从而使能串口。

发送后中断。

4.最后一个数据发送后,再次进入中断,清除发送数据寄存器的空标志,发送后清除中断标志,清除这两个中断标志。

设置RS485的接收方向。

在485芯片的通信中,要特别注意485控制端DE的软件编程。为了可靠地工作,需要在切换485总线状态时进行适当的延迟,然后发送和接收数据。具体方法是在数据传输状态下,将控制端设置为“1”,延时约1ms,发送有效数据,发送一包数据后延时1ms,将控制端设置为“0”。这将使总线在切换状态时有一个稳定的工作过程。