典型的串口通信标准有 RS232 和 RS485,RS232 是全双工点对点的通信,而 RS485 是半双工通信(2 线制),可以一点对多点进行组网,而且 RS485 是用缆 线两端的电压差值来表示传递信号,这与 RS232 电气特性大不一样。RS485 仅仅 规定了接受端和发送端的电气特性,并没有规定或推荐任何数据协议,因此 RS485 的协议层可以和 RS232 一样。
发送数据时,串口控制器的 TX 信号经过 收发器转换成差分信号传输到总线上,而接收数据时,收发器把总线上的差分信 号转化成 TTL 信号通过 RX 引脚传输到串口控制器中
SP3485是板子上的收发器。对收发器,RO是接收输出端,DI是发送数据输入端, RE 是接收使能信号(低电平有效), DE 是发送使能信 号(高电平有效)
开发板把RE和DE共同连接到了PG3,用高低电平来表示是输出有效还是接收有效。
本次列程是用USART2
rs485.c
rs485.h
main.c
RS485需要你自己加个ZT485芯片,再接上STM32的串口,加个GPIO控制其收发;
至于MODBUS协议,它跟STM32本身没关系,需要你自己看MODBUS的文档用STM32的串口实现;
估计你对接的是485接口的传感器,它用的MODBUS可能跟标准的还会有差异,具体看你接的传感器命令说明手册。
STM32是无法直接实现RS485总线的,你可以通过下面方式来实现:
选择STM32内部的一个UART部件,作为串行的接口;
将该UART信号线连接到一个485的驱动芯片,如MAX485,实现电平的转换,这样就可以实现RS485总线了。
上述是实现了RS485的物理层面功能,以这个为基础,通过设计相应的数据格式,就可以实现RS485的数据采集了。
项目中使用STM32 UART连接SN75176与外界实现485通讯,通过一个单独GPIO管脚控制485 传输方向(DE/RE),UART设置为波特率9600,数据位8,停止位1,校验位0。
通讯过程中发现向串口输出一组数据后,UART中断总会接收到一个字节0x00,而上位机并未发送任何数据。
示波器追踪信号发现当SN75176发送数据时,即DE(PIN3)有效时,R(PIN1)端为低电平,当发送完成切换为RE(PIN2)有效时,同时R(PIN1)由低电平转换为高电平。
根据UART传输协议,空闲时保持高电平,如果传输一个字节0x00,在上述设置下,波形表现为9个bit的低电平。
根据波形猜测UART将R(PIN1)端的最后一部分识别为一个字节0x00。
解决办法:由于RS485本来就是半双工通讯,在发送时不可能有数据接收,因此需要在发送数据时关闭UART接收中断,直到发送完成,DE切换为RE有效,做一次读数操作以清除中断标志位(该数据舍弃),然后打开UART接收中断。程序示意如下:
void USART3_send(uint8_t *p,uint32_t len)
{
uint32_t i;
uint8_t Giveup; //读数缓冲
USART_ITConfig(USART3, USART_IT_RXNE,DISABLE); //关闭中断
GPIO_SetBits(GPIOB , GPIO_Pin_12); //切换DE有效
……
发送数据
……
GPIO_ResetBits(GPIOB , GPIO_Pin_12); //切换RE有效
Giveup=USART3-DR; //被舍弃的读数
Giveup=Giveup; //避免编译器报警
USART_ITConfig(USART3, USART_IT_RXNE,ENABLE); //打开中断
}
本文标签:stm32接rs485传感器