RS485 采用半双工通信方式,依托差分信号传输,具备极强的抗干扰能力,支持1000 米以上远距离通信;采用一主多从组网架构,单总线上可挂载 32 个及以上从设备,是工业控制领域的主流通信接口。
RS485 的底层通信逻辑与普通串口基本一致,核心区别在于:RS485 额外配备收发模式控制引脚—— 高电平为发送模式,低电平为接收模式。即在标准串口通信基础上,通过切换该引脚电平实现发送与接收状态的切换。
RS485 数据发送要点数据发送前需将控制引脚置为高电平,切换至发送模式;完成数据发送后,必须及时将引脚置为低电平,恢复接收模式。且在无数据传输时,所有设备均需默认保持接收状态(低电平),避免占用总线影响通信。
RS485发送数据
单字节:
void RS485_SendByte(uint8_t ch)
{
// 1. 切换为 发送模式(高电平)
GPIO_SetBits(GPIOA, GPIO_Pin_0);
// 2. 等待发送完成
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
USART_SendData(USART1, ch);
// 3. 等待彻底发完
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
// 4. 切回 接收模式(必须!)
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}
数组
void RS485_SendData(uint8_t *buf, uint16_t len)
{
// 发送使能
GPIO_SetBits(GPIOA, GPIO_Pin_0);
while(len--)
{
while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));
USART_SendData(USART1, *buf++);
}
// 等待发送完成
while(!USART_GetFlagStatus(USART1, USART_FLAG_TC));
// 接收使能
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}
字符串
void RS485_SendString(char *str)
{
// 1. 切换为发送模式(高电平)
GPIO_SetBits(GPIOA, GPIO_Pin_0);
// 2. 循环发送直到字符串结束符 '\0'
while(*str != '\0')
{
// 等待发送缓冲区为空
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
// 发送一个字符
USART_SendData(USART1, *str++);
}
// 3. 等待所有数据**彻底发送完成**
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
// 4. 必须切回接收模式
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}
其他代码请参考串口通讯:


被折叠的 条评论
为什么被折叠?



