Совместная работа по MODBUS и UART
- Войдите на сайт для отправки комментариев
Всем доброго дня. Помогите разобраться как можно осуществить вывод данных телеметрии, получаемых 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, даже если передатчик выключен. Подскажите в каком направлении двигаться?