简单地东西详细讲,RS485的使用

项目场景:

串口用作RS485使用的场景
市面上有两种RS485芯片,一种是需要手动控制收/发的,便宜且用得普遍,另一种是自动控制收发的,贵且用得少。 对于普通的RS485芯片,要求传输速率不快的,比如就9600bps, 很多硬件工程师直接将收/发使能脚和串口TX引之间加反向电路,并在AB线上加上下拉来实现自动控制收发,而对于需要快一点通信的情形下,需要软件精准控制收发,比如发送时使能发送,发送完成时立即使能接收,但是使能接收的时机很重要。首先转换到接收要尽可能快,对方可能马上就回复了;其次要确保数据完整的发送到从总线。

问题描述

使用GD32F4XX(或其他Arm芯片)串口用作RS485时,使用常见问题:
1、总线瘫痪,任何设备发送数据,总线监控不到
2、其中某个设备发送数据,总线监控总是少最后一个数据或者最后的数据不对

原因分析:

  1. 对于第一个问题:RS485是总线芯片,总线同一时刻只能一个设备发送数据,
    因此它只适合用在半双工通信情景。需要发送数据时,RS485的发送使能一打开,总线便被该485的设备占用。有些人的项目在使用串口DMA发送的时候,异常情况下(比如发送的数据长度为0时)没有处理异常,开启DMA发送前,设置485为发送占用了总线,之后又没有进入发送完成的调用从而没有将RS485设置为接收,导致整个总线瘫痪。
  2. 第二个问题原因(GD32F4XX为例):单个字节发送完成状态有两个,一个是 USART_FLAG_TBE,即“transmit data buffer empty”(数据缓存为空,数据已经从芯片内部寄存器发送出去了),注意,这仅仅代表MCU寄存器数据是空的了,并不代表数据移位的完成,而串口数据是以bit为单位移位出去的; 另一个是 USART_FLAG_TC 即“transmission complete”(发送完成),这个才是移位完成的标记,因此我们要使用这个移位完成的标记,来判断一个字节的完成。
    有些朋友使用DMA发送, DMA发送完成的标记 DMA_FLAG_FTF “full transfer finish flag”(传输完成),代表的仅仅是RAM -> 外设的传输完成,我们可以理解是最后一个字节刚好通过DMA通道传输到了串口发送寄存器,但是可能还没有移位完成。如果在串口总中断处查询到这个标记,并不能代表数据移位到RS485总线的完成。因此在串口总中断里面,(如果是使用STM的hal库,是在相关回调函数里面),你还需要开启USART_INT_TC 即“transmission complete interrupt and flag”中断,当此中断完成后,才是真正的一帧数据由串口完全发送了出去。

解决方案:

1、添加异常调用,异常后使能RS485接收
2、USART_FLAG_TC 即“transmission complete”(发送完成),这个才是移位完成的标记,因此我们要使用这个移位完成的标记,来判断一个字节的完成; DMA发送完成中断后,继续等待USART_INT_TC 中断。
GD32F4XX的串口收发处理描述为例:

/***接收完成处理,一般是读取DMA通道的数据后再开启DMA接收且通知上层应用处理***/
__weak   void  usartCom1_rx_cplt(uint16_t u16transLen)
{
   
    ;
}
/***发送完成处理,一般是打开RS485接收,通知更上层应用发送完成***/
__weak   void  usartCom1_tx_cplt(void)
{
   
    ;
}
/***普通轮询发送***/
void usartCom1Send(uint8_t *ucBuf, uint8_t ucLen)
{
   
    int i;
    
    for (i = 0; i < ucLen; i++)
    {
   
        while(
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RS485是一种串行通信协议,常用于远距离数据传输。它可以支持多个设备在同一总线上进行通信,因此被广泛应用于工业自动化、楼宇自控等领域。下面是RS485通信的一些详细介绍: 1. 物理层 RS485通信采用差分信号传输,即在两个信号线A和B之间传输数据,A线为正极,B线为负极。在传输数据时,A线上的电压高于B线上的电压表示二进制1,反之表示二进制0。这种差分信号传输方式可以有效地抵消电磁干扰和噪声,从而提高通信的可靠性和稳定性。 2. 通信方式 RS485通信可以采用半双工或全双工通信方式。半双工通信方式只能在同一时间内进行发送或接收操作,而全双工通信方式可以同时进行发送和接收操作。 3. 总线拓扑 RS485通信采用总线拓扑结构,即多个设备共享同一条通信线路。在总线上,每个设备都有一个唯一的地址,可以通过地址来识别不同的设备。当一个设备需要发送数据时,它会先发送一个请求信号,其他设备会监听总线上的信号,如果没有其他设备正在发送数据,则该设备可以开始发送数据。 4. 通信协议 RS485通信可以采用不同的通信协议,例如MODBUS、Profibus等。这些通信协议定义了数据的格式、传输方式、错误检测等内容,从而保证通信的正确性和可靠性。 5. 软件实现 在软件实现上,RS485通信需要通过串口进行实现。在发送数据时,需要将数据通过串口发送出去,并等待接收到其他设备的响应。在接收数据时,需要通过串口接收数据,并进行解析和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值