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收发选择线
}
所有图片均出自洋桃电子。