STM32-RS485
RS485通信介绍:
典型的串口通信标准有RS232和RS485,RS232是全双工点对点的通信,而RS485是半双工通信(2线制),可以一点对多点进行组网,而且RS485是用缆线两端的电压差值来表示传递信号,这与RS232电气特性大不一样。RS485 仅仅规定了接受端和发送端的电气特性,并没有规定或推荐任何数据协议,因此RS485的协议层可以和RS232一样。
硬件连接图:
code:
将引脚设置好,因为是半双工通信,所以这边是通过控制485RE引脚实现处于发送模式还是接受模式,其它和串口配置一样的使用。
//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
u8 t;
RS485_TX_EN=1; //设置为发送模式
for(t=0;t<len;t++) //循环发送数据
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
USART_SendData(USART2,buf[t]);
}
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
RS485_RX_CNT=0;
RS485_TX_EN=0; //设置为接收模式
}
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
u8 rxlen=RS485_RX_CNT;
u8 i=0;
*len=0; //默认为0
delay_ms(10); //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
{
for(i=0;i<rxlen;i++)
{
buf[i]=RS485_RX_BUF[i];
}
*len=RS485_RX_CNT; //记录本次数据长度
RS485_RX_CNT=0; //清零
}
}