STM32学习100步之第五十九-六十步——RS232与RS485通信。

RS232和RS485都是基于USART通信,是通信协议,基本原理在软件配置上相差不多,下面是连接原理图:

在这里插入图片描述

RS232

RS232是将单片机的TTL电平通过专门的芯片转换为RS232电平,在接收端,再将RS232芯片转换为单片机的TTL电平即可。其发送和接收大体上和USART相同,USART3的两个端口和PB10、PB11端口复用,硬件连接如下图:。
在这里插入图片描述
在这里插入图片描述

RS485

RS是一种总线模式,输出两条差分线不可混淆,所有的设备都需要按照下面的原理图连接

在这里插入图片描述

采用差分方式加大了传输的稳定性与距离,与RS232不同的是,RS485需要多占用单片机的一个IO端口,用该端口的0/1状态位表示该单片机是处于接收状态还是发送状态,开发板原理图连接如下:将单片机上的A、B端子引出的线连接到总线上即可
在这里插入图片描述
在这里插入图片描述
RS485和USART3的发送函数大体上相同,不同的是RS485发送时,需要置位控制端信号,发送时置为高电平,发送完毕之后置为低电平,另外RS485通信复用了USART3的连个端口,需要利用之前写好的初始化函数进行初始化方可使用,RS485_Init()初始化的目的初始化控制发送的位,而发送接收位在USART3的初始化中进行初始化。


	USART3_Init(115200);//串口3初始化并启动
	RS485_Init();//RS485总线初始化,需要跟在USART3初始化下方
	
void USART3_printf (char *fmt, ...){ 
	char buffer[USART3_REC_LEN+1];  // 数据长度
	u8 i = 0;	
	va_list arg_ptr;
	va_start(arg_ptr, fmt);  
	vsnprintf(buffer, USART3_REC_LEN+1, fmt, arg_ptr);
	while ((i < USART3_REC_LEN) && (i < strlen(buffer))){
        USART_SendData(USART3, (u8) buffer[i++]);
        while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); 
	}
	va_end(arg_ptr);
}

void RS485_printf (char *fmt, ...){ 
	char buffer[USART3_REC_LEN+1];  // 数据长度
	u8 i = 0;
	va_list arg_ptr;
	GPIO_SetBits(RS485PORT,RS485_RE); //为高电平(发送)//RS485收发选择线	
	va_start(arg_ptr, fmt);  
	vsnprintf(buffer, USART3_REC_LEN+1, fmt, arg_ptr);
	while ((i < USART3_REC_LEN) && (i < strlen(buffer))){
        USART_SendData(USART3, (u8) buffer[i++]);
        while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); 
	}
	va_end(arg_ptr);
	GPIO_ResetBits(RS485PORT,RS485_RE); //为低电平(接收)//RS485收发选择线	
}

所有图片均出自洋桃电子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值