STM32运用RS485通信总结

1、RS485接口原理:

1.串口:串口是一种接口标准,它规定了接口的电气标准,简单说只是物理层的一个标准。没有规定接口插件电缆以及使用的协议,所以只要接口电缆符合串口标准就可以在实际中灵活使用,在串口接口标准上使用各种协议进行通讯以及设备控制。

典型的串行通讯标准是RS232和RS485,定义了电压、阻抗等,但没有对软件协议进行定义。

2.485接口:属于OSI模型物理层的电气特性规定为2线、半双工、多点通信的标准。与RS232电气特性不一样。用缆线两端电压差值来表示信号传递。RS485仅规定接收和发送端的电气特性,无数据协议的规定。

2、RS485特点:

1.接口电平低,不易损坏芯片。RS485的电气特性:逻辑“1”以两线间的电压差为+(2~6)V表示;逻辑“0”以两线间的电压差为-(2~6)V表示。接口信号电平比RS232降低了,不易损坏接口电路的芯片。

2.传输速率高。10米时,RS485的数据最高传输速率可达35Mbps,在1200m时,      传输速度可达100Kbps。

3. 抗干扰能力强。RS485接口是采用平衡驱动器和差分接收器的组合,抗共模干     扰能力增强,即抗噪声干扰性好。

4、传输距离远,支持节点多。RS485总线最长可以传输1200m以上(速率    ≤100Kbps)一般最大支持32个节点,如果使用特制的485芯片,可以达到128个    或者256个节点,最大的可以支持到400个节点。

3、RS485连接方式 :推荐使用在点对点网络中,线型,总线型,不能是星型,环型网络。理想情况下RS485需要2个匹配电阻,其阻值要求等于传输电缆的特性阻抗(一般为120Ω)。没有特性阻抗的话,当所有的设备都静止或者没有能量的时候就会产生噪声,而且线移需要双端的电压差。没有终接电阻的话,会使得较快速的发送端产生多个数据信号的边缘,导致数据传输出错。连接线路图:

                                               STM32运用RS485通信总结_第1张图片    

在上面的连接中,如果需要添加匹配电阻,我们一般在总线的起止端加入,也就是主机和设备4上面各加一个120Ω的匹配电阻。

4、RS485收发器:

                                                                           STM32运用RS485通信总结_第2张图片

图中 A、 B 总线接口,用于连接 485 总线。 RO 是接收输出端, DI 是发送数据收入端, RE是接收使能信号(低电平有效), DE 是发送使能信号(高电平有效)。通过该芯片连接串口,配置好串口后就可以进行485通信。

5、一段较好的代码学习:

在这段代码当中,如果按下了按键,返回值为1,说明本机是发送者,在进行if判断之后,进入发送数据,由于本机是发送者没有进入中断接收数据,所以在进入RS485_Receive_Data(rs485buf,&key)函数是不会有CNT的加加,而对于赋值的len指针来说,通过自身存入了key的地址,所以key此时依然为0,不会执行下边的判断程序,对于接收机来收,触发中断,CNT加加,通过指针指向的地址,执行下边的判断。(传入地址通过指针指向地址,向指针指向地址变量赋值。重要)

1.主函数:

#define KEY0_PRES     1    //KEY0按下
#define KEY1_PRES    2    //KEY1按下
#define KEY2_PRES    3    //KEY2按下
#define WKUP_PRES   4    //KEY_UP按下

//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下;1, KEY0 按下;2, KEY1 按下;3, KEY2 按下 ;4, KEY3 按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!!
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1; //按键按松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))
{
    delay_ms(10); //去抖动
    key_up=0;
    if(KEY0==0)return KEY0_PRES;
    else if(KEY1==0)return KEY1_PRES;
    else if(KEY2==0)return KEY2_PRES;
    else if(KEY3==1)return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;
return 0; // 无按键按下
}

while(1)
    {
        key=KEY_Scan(0);
        if(key==KEY0_PRES)
        {
            for(i=0;i<5;i++)
            {
                rs485buf[i]=cnt+i;
             }
            RS485_Send_Data(rs485buf,5);                                    
        }         
        RS485_Receive_Data(rs485buf,&key);
        if(key)
        {
            if(key>5)key=5;
             for(i=0;i

 

你可能感兴趣的:(STM32运用RS485通信总结)