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