真正实现Arduino UNO+RS485+轮询+一主“多”从通讯,自己编辑通讯协议

本文详细介绍了一种RS485一主多从的通讯方案,通过主机轮询的方式,使对应的从机发送数据,实现数据的准确接收。文章提供了具体的主机和从机代码示例,适合用于比赛或项目中的数据接收,无需复杂的Modbus协议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于rs485的一主多从通讯,网上浏览量比较多的几篇优快云大部分都是说的一主一从通讯(截止到我写稿为止),如果你想让自己的单片机群真正实现一主多从,那么这篇正是你所需要的!

        我还需要声明一下,我是做大创的时候,需要用主机去接收不同从机上超声波传感器的信息,查了很多相关资料都没查到。有很多资料说要用modbus协议的,其实那个是工业上完整的数据通信协议,如果只是做个比赛或者项目来接收数据的话,用不到那么复杂,完全可以自己写,具体怎么写,我会在下面详细说。主要方式呢就是主机通过轮询,使对应的从机发送数据,然后主机接收。这也是我第一次写博客,希望大家多支持哈!

       1、首先我需要假定你已经看过并大致了解了rs485的一些简单通讯方法,如一主一从。那么现在来说一些干货吧。485是两根线,会抑制共模误差,高电平发送数据,低电平接收,可以理解成水从高处往低处流,并且每次只能一个单片机处于高电平,但是所有处于低电平的单片机都可以接收到总线的数据。所以我们的主路线:

      ①我们首先给从机编好地址:0、1、2……(自己随便编就好);

      ②然后让主机先处于高电平,从机处低电平;

      ③之后主机发送某个从机的地址(比如主机想看第0个从机的信息,那就发送0)后拉低,每一个从机接收到主机发送后的数据后(比如0)和自己的地址进行对比,如果相等,拉高,把相应数据发到总线上,发完拉低;若不相等,则不动作。所以每次只会有一个从机会给主机回应消息;

      ④等主机接收到信息后开始询问下一个从机,若在一段时间内未收到消息则再重发该地址进行询问。

      2、贴出来主机代码:

/*==========master============*/
#include <SoftwareSerial.h>
SoftwareSerial Master(10, 11); 
char val[5]={'0','0','N','N','N'};              //定义一个数组,用来将从机地址和信息匹配
char address;                                   //定义从机地址
int DE_RE=2;
 
void setup() {
  Serial.begin(9600);                         //初始化
  Serial.println("Master is ready!");
  Master.begin(38400);
  pinMode(DE_RE,OUTPUT);  
  digitalWrite(DE_RE,LOW); 
}
 
void loop() 
{ 
  for(int i = 49 ; i < 51 ; i++)              //用来对每个从机进行一次大轮询
  {
//==========发送车位序号i=============================================//
      digitalWrite(DE_RE,HIGH);               //将主机设为发送状态
      address = i;                            //给从机发地址,此时是字符式,49对应1的字符串
      Master.write(address);                  //传唤对应号码的从机
      digitalWrite(DE_RE,LOW);                //然后立马换成接收状态 
      delay(500);                             //等一下从机反应,之前没有delay, 
                                              //maste.available还没反应过来,就过去了,加个 
                                              //delay刚刚好
                                              //或许等从机加了超声波,还得调delay的时间
                                    
//==========接收车位信息到数组val里===================================//  
      while(Master.available())               //等从机把数据发过来
      { 
          val[i-49] = Master.read();          //读车位信息到数组val
      }
      delay(1000);                            //小循环
  }                                           //整个for循环结束

  for(int a = 0 ; a < 5 ; a++)                //然后把整个字符串打印出来进行观察
  {
      Serial.print(a+1);
      Serial.print(val[a]); 
  }
 
  delay(2000);                                //最后一整个过程结束后,多等两秒钟
}

  其次一主多从之间进行通讯时采用软串口,因为TX、RX要用到串口显示(此处是借鉴了一主一从博主的经验)。另外主机发完地址后,需要delay一会,要不然程序很快就会去拉低+接收,这样从机还没来得及发消息,主机就做去询问下一个了,以致于错过数据。我这里delay500那里是为了等从机的超声波传感器测数据。具体要多久可以自行测试。还有一点,这是数据通信,传的是字符,如果想传1,那还得换算成ASCII码,好像是49吧。

       3、贴出来从机代码:

/*      Slave     */
#include <SoftwareSerial.h>
SoftwareSerial Slave(10, 11);  
char val; 
int DE_RE=2;


void setup() {
  Serial.begin(38400);   
  Serial.println("Slave is ready!");
  Slave.begin(38400); 
  pinMode(DE_RE,OUTPUT);   
  digitalWrite(DE_RE,LOW);
  
}

void Distance_test()      // 量出前方距离 
{
  //pass
}  

void loop() 
{  
  while(Slave.available()) 
  {
    val = Slave.read();         //在rs485中读串口
    Serial.write(val);          //把地址写到串口中去
    if(val=='1')                //如果确定为自己的地址
    {
      Distance_test();          //测距离
      digitalWrite(DE_RE,HIGH); //拉高
      if(Distance < 35)   
      Slave.write("Y");         //判断
      else Slave.write("N");    //判断
    }
  } 
}

主从机之间读取信息是master.read、master.available、Slave.read、Slave.available,而串口的都是Serial.read()什么的,这里不要弄混了。不同从机改变一下地址编号即可。

       行吧,大体就是这样了,希望可以帮到大家。有什么疑问可以直接留言,我看到会及时回复!也欢迎大家给我指正!

通常,在工业中,我们有几种器和设备(PLC,CNC,变频器)来控制和监视最样化的工业过程。 为了使所有这些设备起工作,必须在它们之间建立通信网络。 但是,由于电动,螺线管和其他执行器的激活,该行业环境中存在许电磁干扰。 RS485通信标准是通信网络的物理层,可以实现种协议,例如Modbus,Profibus等。 RS485通信标准适合在行业中实施,因为它接受几种网络拓扑,例如星形和环形。 它允许长距离通信,并使用双绞线电缆。由于我们具有差分通信信号,因此该电缆模型减少了电磁干扰,这有助于更好地抵抗噪声和电磁干扰。 除了RS485通讯之外,还有RS232通讯。它允许以点对点模式进行网络通信,并且遭受电磁干扰的影响更大。 但是,许设备具有RS232通信,需要长距离传输数据。为此,我们需要使用称为MAX485的集成电路。 该集成电路在使TTL逻辑电平适应RS485通信所需的逻辑电平中发挥作用。 如今,已经有使用该集成电路的现成的低成本模块。它们允许信号调理并促进不同设备之间的通信。 因此,由于其坚固性,RS485通信可用于任何类型的环境。 因此,在本文中,我们将学习如何监视环境温度以及如何通过两个Arduino之间的串行/ RS485通信接收测量值。 Arduino Slave(发送器)将使用DS18B20数字传感器执行温度测量,并将测量值通过串行/ RS485发送到Arduino设备(接收器),该设备将在LCD显示屏上写入20 x 4 I2C接收的温度值。 因此,通过本文您将学到: 在原型板上执行电路组装; 了解RS 485模块的操作; 了解DS18B20传感器的工作原理; 创建通信协议; 使用有线通信网络进行远程温度监控; 现在,我们将开始通过RS485串行通信使用DS18B20传感器进行温度监控项目的开发的完整介绍。 通过RS485串行通信使用DS18B20传感器开发温度监控项目 在图3中,我们具有项目组装所需的原理图电路。Arduino Uno将成为(接收器),它将接收温度测量值并将在LCD显示屏上显示20 x 4 I2C。 Arduino Nano将作为从设备(发送器),它将读取DS18B20传感器并通过RS485模块发送测量值。 现在,让我们转到设置项目所需的材料清单。 带有DS18B20和RS485模块的Arduino项目 温度传感器DS18B20是数字温度传感器,因为要传输信息,它使用协议1-Wire。 1-Wire协议由Dallas Semiconductor和Maxim制造。 1线总线对设备使用/从概念。 微控制器是,外围设备是从。 在制造过程中,每个设备都会收到个唯的ID,即设备标识号(地址),以便在有很设备时可以在总线上对其进行标识。 信息格式: 1线仅使用条数据线,并使用长脉冲和短脉冲表示1和0。60微秒脉冲表示0,15微秒脉冲表示1。 在VCC与DS18B20传感器的信号引脚之间必须使用4K7的上拉电阻,以使微控制器与传感器之间的通信稳定。 将发射器和接收器电路组装到原型板上之后,我们可以在图6中看到原型板上的物理组装。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值