RS485

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);
}

其他代码请参考串口通讯:

串口通讯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值