首页 > 解决方案 > Arduino Mega 和 RS485 Modbus 传感器

问题描述

我正在尝试使用 RS485 通信将土壤传感器连接到 arduino mega,但我无法让它工作。我正在使用 SparkFun RS485 分线器:https ://www.sparkfun.com/products/10124 我已将 TX 连接到引脚 18,将 RS 连接到引脚 19,将 RTS 连接到引脚 8。我尝试调整代码此处:https ://www.youtube.com/watch?v=tBw15SfmuwI使用传感器的制造商默认设置:

  1. Modbus 地址固定为 0
  2. 通讯配置为9600,N,8,1(9600bps,无校验位,8个数据位,1个停止位)</li>
  3. 通讯协议是 Modbus-RTU 而我需要读取的地址是 0x0000-0x0002。但是,当我打开串行监视器“?”时,我得到随机字符作为输出,知道为什么吗?对于读取传感器输出的任何帮助,我将不胜感激。这是我使用的代码:
#include <ModbusMaster.h>

#define MAX485_DE 8
#define MAX485_RE_NEG 8
ModbusMaster node;

void preTransmission () {
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission () {
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}

void setup() {
  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
  Serial.begin(9600);
  node.begin(0,Serial);
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
}

void loop() {
  uint8_t resultMain;
  resultMain = node.readInputRegisters(0x0000, 3);
  if (resultMain == node.ku8MBSuccess) {
    Serial.println("-------");
    Serial.print("Temp: ");
    Serial.println(node.getResponseBuffer(0x00) /100);
    Serial.print("VWC: ");
    Serial.println(node.getResponseBuffer(0x01) /100);
    Serial.print("EC: ");
    Serial.println(node.getResponseBuffer(0x02) /100);
  }
}

标签: arduinosensorsmodbusrs485

解决方案


arduino mega 有 3 个串口:

  • 串行
  • 序列号 1
  • 序列号 2

您可以将其视为 Serial 为 Serial0(从不写入零)。这个端口硬连线到 arduino mega 上的 USB 端口。

您的 RS485 分线板连接到 Serial1。您可能会注意到在 18 和 19 针脚旁边的 mega 上的丝网印刷表示 TX1 和 RX1。

因此,当您在此行初始化节点时:

node.begin(0,Serial);

你应该通过它 Serial1 而不是 Serial
例如

node.begin(0,Serial1);

推荐阅读