Modbus gibt immer 65535 aus, Probleme mit Datentyp?

Hallo zusammen,

ich habe mir nun einen MEGA zugelegt mit dem ich über einen separaten Hardware Serial Port den Modbus auslesen kann.
Mit einem "einfachen" Temperatursensor funktioniert die Auslesung prima.
Da ich im Rahmen meiner Wetterstation mit einem professionellen Sensor die Temperatur/Feuchte erfassen möchte, habe ich mir nun den Lambrecht Sensor zugelegt. Über QModbus master mit USB/RS485 Converter kommen die Werte einwandfrei.

Über den MEGA wird jedoch immer ein Wert von 65535 ausgegeben, was recht warm ist :slight_smile:

Im Handbuch meines Sensors steht etwas von "BIG Endian 32Bit" womit ich nichts so richtig anfangen kann.
Leider bin ich in dem Thema Datentypen noch nicht so richtig drinn.
Ich vermute dass in den Zeilen unterhalb des void loop etwas nicht stimmt.

Vielleicht kann sich das mal jemand ansehen. Vielen Dank im Voraus

#include <ModbusMaster.h>

#define MAX485_TX_ENABLE  13  // EIA-485 transmit control pin

ModbusMaster node;

void preTransmission() {
  digitalWrite(MAX485_TX_ENABLE, true);// Vor der Übertragung wird Pin 13 auf High gesetzt.
}

void postTransmission() {
  digitalWrite(MAX485_TX_ENABLE, false);// Nach der Übertragung wieder auf Low
}


void setup() {
  
  pinMode(MAX485_TX_ENABLE, OUTPUT);
  digitalWrite(MAX485_TX_ENABLE, false);

  Serial.begin(19200);
  Serial1.begin(19200, SERIAL_8E1); //Baudrate des Sensors auf 19200, 1Start Bit, Parität EVEN, 1 Stop Bit

  node.begin(4, Serial1);//Start der seriellen Schnittstelle, Slave ID 4
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);

  Serial.print("Lambrecht THP - Modbus");// Bezeichnung meines Sensors
}


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


  result = node.readInputRegisters(30401, 1);//Funktion : Read Input Registers, Modbus Adresse 30401

 
  if (result == node.ku8MBSuccess)
  {
    
    Serial.print("Temperatur: ");
    Serial.println(node.getResponseBuffer(30401));//Temperatur, Datentyp laut Handbuch INT (???)
    Serial.print(" °C");

   
  }
  else {
  Serial.print("Fehler beim Auslesen des Sensors\n");
  }

  delay(10000);//Aktualisierung alle 10 Sekunden
}

Ich würde vermuten, daß das -1 sein soll (mit Vorzeichen) und ein Fehlercode ist.

"int" ist ein unbrauchbarer Datentyp, je nach Quelle unterschiedlich groß. Ich würde vermuten daß hier ein Arduino "long" bzw. int32_t gemeint ist

Little/big endian gibt an, ob das höchste oder niedrigste Bit oder Byte eines Werts zuerst übertragen wird. Das sollte eigentlich schon in der ModBus Bibliothek richtig gehandelt werden.

Hi

Auch ließen sich die Endian's in den Tiefen des WWW durchaus finden.
Zeigt mir, daß Du kaum Interesse hast, Dein Problem selber zu lösen.

Wenn Dein Sketch auf dem Uno klappt, auf dem Mega aber nicht, kommt mir direkt SPI in den Sinn - dieser Bus hat auf dem Mega andere Pins (50...53) als auf dem Uno (10...13).
Somit kännte Es sein, daß die SPI-Hardware eben einen hochgezogenen Pin einliest - und nach 16x Einlesen hat Es 0b11111111'11111111, was zufällig 65535 (größte Wert 16 Bit unsigned) oder eben -1 (erste negative Wert signed - alle Bits sind gesetzt) darstellt.

Ob Das Das sein kann - kA, habe mir Deinen Sketch noch nicht angeschaut.

MfG

Hallo zusammen,

erfreuliche Nachrichten. Es läuft jetzt.
Der Grund war dass in der Funktion "getResponseBuffer(30401)" nochmal die Adresse eingetragen war was wohl nicht richtig ist.
Ich habe ihn jetzt durch 0 ersetzt, da die 0 für den ersten Wert, in diesem Fall auch einzigen Wert steht.

Schönen Sonntag noch

Gruß Stefan