Arduino due modbus

Доброго времени суток, есть вопрос по работе modbus. Есть система из малинки и дуи соединенная через rs485. Не идет сигнал не rx не tx , нужно и получать и отправлять значения, подскажите как с этим сдюжить. Прикрепляю код


#include <microDS18B20.h>
#include <ModbusRtu.h>

constexpr int sensorPin1 = 22;
constexpr int sensorPin2 = 23;
constexpr int sensorPin3 = 24;
constexpr int sensorPin4 = 25;

MicroDS18B20<sensorPin1> sensor1;
MicroDS18B20<sensorPin2> sensor2;
MicroDS18B20<sensorPin3> sensor3;
MicroDS18B20<sensorPin4> sensor4;

float temperature1 = 0.0;
float temperature2 = 0.0;
float temperature3 = 0.0;
float temperature4 = 0.0;

uint16_t au16data[5]; 

// Инициализируем объект Modbus с использованием UART1 (Serial1) и пинов для управления направлением передачи (TXEN)
Modbus slave(1, Serial1, 2); // this is slave @1 and RS-485

void setup() {
  Serial1.begin(57600); // Инициализируем Serial1 на скорости 19200 бод
  slave.start();
}

void loop() {
  // Запрашиваем температуру с каждого датчика
  sensor1.requestTemp();
  if (sensor1.readTemp()) temperature1 = sensor1.getTemp();

  sensor2.requestTemp();
  if (sensor2.readTemp()) temperature2 = sensor2.getTemp();
  
  sensor3.requestTemp();
  if (sensor3.readTemp()) temperature3 = sensor3.getTemp();
  
  sensor4.requestTemp();
  if (sensor4.readTemp()) temperature4 = sensor4.getTemp();

  // Считываем и выводим температуру с каждого датчика
  au16data[0] = static_cast<uint16_t>(temperature1 * 100);
  au16data[1] = static_cast<uint16_t>(temperature2 * 100);
  au16data[2] = static_cast<uint16_t>(temperature3 * 100);
  au16data[3] = static_cast<uint16_t>(temperature4 * 100);

  if (slave.poll(au16data, 5) > 0){}
}

Данный код отлично работает на uno но никак не хочет работать с дуе

не нашел в описании библиотеки ни слова про Дуе

Вот в этой строчке, по вашему, все в порядке?

Метод poll возвращает статус операции, зачем же вы его так старательно игнорируете?

и да, первым делом я бы избавился вот от этого:

я уверен, что гайверовское поделие не рассчитано на работу с Дуе и будет глючить.
Основная идея использования “микро-” библиотек от Гайвера - экономия места. Но на Дуе его хоть попой ешь… извините. Зачем вам этот гемор, возьмите стандартную библиотеку.

1 лайк

Убрал игнорирование но все равно не работает , выводил температуру просто в монитор порта все считывается, но буду менять как вы посоветовали

#include <microDS18B20.h>

// Настройки Modbus
uint8_t id = 1; 
uint8_t txenpin = 2; 
Modbus modbus(id, Serial1, txenpin); 
const int REGISTERS_SIZE = 10;
uint16_t modbus_registers[REGISTERS_SIZE];

// Настройки датчика температуры
constexpr int sensorPin1 = 22;
MicroDS18B20<sensorPin1> sensor1;
float temperature1 = 0.0;

void setup() {
  Serial1.begin(9600);
  modbus.start();
}

void loop() {
  // Запрашиваем температуру с датчика
  sensor1.requestTemp();
  if (sensor1.readTemp()) temperature1 = sensor1.getTemp();

  // Конвертируем и сохраняем температуру в регистры Modbus
  modbus_registers[0] = static_cast<uint16_t>(temperature1 * 100);

  // Обновление состояния Modbus
  modbus.poll(modbus_registers, REGISTERS_SIZE);
}

Поменял снятие с татчиков температуры


#include <ModbusRtu.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Настройки Modbus
uint8_t id = 1; 
uint8_t txenpin = 2; 
Modbus modbus(id, Serial1, txenpin); 
const int REGISTERS_SIZE = 10;
uint16_t modbus_registers[REGISTERS_SIZE];

// Настройки для датчика температуры DS18B20
OneWire oneWire(sensorPin1);
DallasTemperature sensors(&oneWire);

void setup() {
  Serial1.begin(9600);
  modbus.start();
  sensors.begin();  // Инициализация библиотеки DallasTemperature
}

void loop() {
  sensors.requestTemperatures(); // Запрос температуры с датчика
  temperature1 = sensors.getTempCByIndex(0); // Чтение температуры

  // Конвертируем и сохраняем температуру в регистры Modbus
  modbus_registers[0] = static_cast<uint16_t>(temperature1 * 100);

  // Обновление состояния Modbus
  modbus.poll(modbus_registers, REGISTERS_SIZE);
}