Совместная работа по MODBUS и UART

Нет ответов
a1ro
Offline
Зарегистрирован: 21.02.2020

Всем доброго дня. Помогите разобраться как можно осуществить вывод данных телеметрии, получаемых Arduino UNO по радиоканалу с LORA-модуля E32 (868T20D), в регистры MODBUS. Обмен данными между Arduino UNO и LoRa-модулем происходит по UART. Если произвожу передачу переменных в серийных порт компьютера, то все Ок. Вот рабочий код программы когда данные передаются по UART в компьютер:

#include <SoftwareSerial.h>
#include "EBYTE.h"


struct DATA {
  unsigned long Counter;
  int Bits;
  float Volts;
  float Current;
};

int Chan;

DATA Info;

SoftwareSerial ESerial(2, 3); //связь Дуни и Е32
EBYTE Transceiver(&ESerial, 4, 5, 6);

void setup() {
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, INPUT);
  
  Serial.begin(9600);
  
  ESerial.begin(9600);

  Serial.println("Starting Reader");
 
  Transceiver.init();

  Transceiver.PrintParameters();  
}

void loop() {
if (ESerial.available()) {
  Transceiver.GetStruct(&Info, sizeof(Info));

  Serial.print("Counter: "); Serial.println(Info.Counter);
  Serial.print("Volts: "); Serial.println(Info.Volts);
  Serial.print("Bits: "); Serial.println(Info.Bits);
}

  else {
    delay(1000);
    Serial.println("Error connection: ");
  }
}

Мне же надо значения Info.Counter, Info.Volts, Info.Bits перенести в регистры модбаса для последующего считывания сервером.

Набросал примерный код, но нужные значения в регистры не прилетают. В коде пытаюсь передать значения только Info.Bits и записать в регистр 2. Регистр 3 использую для проверки связи по радиоканалу.

#include <SoftwareSerial.h>
#include "EBYTE.h"
#include <SimpleModbusSlave.h>

enum
{
  ADC_VAL,
  PWM_VAL,
  HOLDING_REGS_SIZE = 4
};

struct DATA {
  unsigned long Counter;
  int Bits;
  float Volts;
  float Current;
};

int Chan;

DATA Info;

unsigned int holdingRegs[HOLDING_REGS_SIZE];

SoftwareSerial ESerial(2, 3); //связь Дуни и Е32
EBYTE Transceiver(&ESerial, 4, 5, 6);

void setup() {
  
  ESerial.begin(9600);
 
  modbus_configure(&Serial, 9600, SERIAL_8N2, 1, 2, HOLDING_REGS_SIZE, holdingRegs); //вводим скорость опроса
  modbus_update_comms(9600, SERIAL_8N2, 1);

  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, INPUT);


  //Serial.println("Starting Reader");

  Transceiver.init();

  //Transceiver.PrintParameters();

}

void loop() {
 
  modbus_update();

  if (ESerial.available()) {
    Transceiver.GetStruct(&Info, sizeof(Info));
    holdingRegs[2] = Info.Bits;
    holdingRegs[3] = 1;
  }

  else {
    delay(1000);
    //Serial.println("Error connection: ");
    holdingRegs[2] = 2;
    holdingRegs[3] = 0;

  }
}

Такое ощущение, что общение по UART с беспроводным модулем не происходит. Регистру 2 всегда присваивается 0, а регистру 3 присваивается 1, даже если передатчик выключен. Подскажите в каком направлении двигаться?