首页 > 解决方案 > arduino 作为 modbus RS485 从机向主机发送消息

问题描述

我会说法语,请原谅我糟糕的英语。我正在研究 2 个 arduino megas 之间的 rs485 modbus 通信。我希望从机向主机发送例如值“10”。在从机上,我使用库https://github.com/yaacov/ArduinoModbusSlave的示例:

    #include <ModbusSlave.h>


    // explicitly set stream to use the Serial serialport
    Modbus slave(Serial, 1); // stream = Serial, slave id = 1, rs485 control-pin = 8

    void setup() {
        // register handler functions
        slave.cbVector[CB_READ_INPUT_REGISTERS] = ReadAnalogIn;
     //   slave.cbVector[CB_READ_HOLDING_REGISTERS] = readMemory;

        // start slave at baud 9600 on Serial
        Serial.begin( 9600 ); // baud = 9600
        slave.begin( 9600 );
    }

    void loop() {
        // listen for modbus commands con serial port
        slave.poll();
    }

    // Handel Read Input Registers (FC=04)

    uint8_t ReadAnalogIn(uint8_t fc, uint16_t address, uint16_t length) {
        // write registers into the answer buffer
        for (int i = 0; i < length; i++) {
          uint16_t res;
          res = 221;
          //slave.writeRegisterToBuffer(i, analogRead(address + i));
          slave.writeRegisterToBuffer(i,10);


        }
        return STATUS_OK;
    }

在主人上,我使用图书馆中的一个例子https://github.com/4-20ma/ModbusMaster

'''

#include <ModbusMaster.h>


// instantiate ModbusMaster object
ModbusMaster node;


void setup()
{
  // use Serial (port 0); initialize Modbus communication baud rate
  Serial.begin(9600);

  // communicate with Modbus slave ID 1 over Serial (port 0)
  node.begin(1, Serial);
}


void loop()
{
  static uint32_t i;
  uint8_t j, result;
  uint16_t data[6];

  i++;

  // set word 0 of TX buffer to least-significant word of counter (bits 15..0)
//  node.setTransmitBuffer(0, lowWord(i));

  // set word 1 of TX buffer to most-significant word of counter (bits 31..16)
//  node.setTransmitBuffer(1, highWord(i));

  // slave: write TX buffer to (2) 16-bit registers starting at register 0
//  result = node.writeMultipleRegisters(0, 2);

  // slave: read (6) 16-bit registers starting at register 2 to RX buffer
  result = node.readHoldingRegisters(2, 6);

  // do something with data if read is successful
  if (result == node.ku8MBSuccess)
  {
     Serial.println(result);

  }
}

'''

但它不起作用,似乎arduino之间没有通信。有没有人有办法解决吗?

标签: arduinomodbus

解决方案


推荐阅读