Transmission RS485 via protocole ComLynx

Bonjour,

Ceci est mon premier post, mais cela fait un certain temps que je pratique l’Arduino grâce à ce que je trouve sur internet, avec ce forum notamment, et en bidouillant.

J’habite dans une maison équipée de panneaux solaires.
Le système utilise un onduleur Danfoss ULX3000 qui possède 2 ports de communications RS485 utilisant un protocole propriétaire ComLynx qui est décrit dans le document en pièce jointe.
Je souhaite donc récupérer des informations de l’ondeur via un des ports RS485.

Matériel

Quelques précisions :

  • Le documentation indique que la vitesse de communication est de 19200 baud (
  • N’ayant qu’un port série, la librairie SoftwareSerial est utilisée
  • J’ai utilisé la page en pièce jointe pour connecté mon câble RJ45 sur le Module RS485 (page extraite de la documentation d’un autre onduleur de la même marque qui utilise le protocole ComLynx)

Voici comment j’ai câblé l’ensemble le module RS485 aux autres éléments :

  • Pin DI : pin 11 de l’Arduino

  • Pin DE : pin 8 de l’Arduino

  • Pin RE : pin 8 de l’Arduino

  • Pin RO : pin 10 de l’Arduino

  • Pin Vcc : pin +5V de l’Arduino

  • Pin Gnd : pin GND de l’Arduino ET Fils orange et blanc/orange du câble RJ45 (Pins 1 et 2)

  • Pin A : fil blanc/vert du câble RJ45 (Pin 3)

  • Pin B : vert du câble RJ45 (Pin 6)

Code
Le premier code que j’ai fait est censé permettre de faire un ping à l’onduleur pour connaître son adresse (première trame de la procédure page 26 de la doc).
En réponse je dois recevoir un code similaire à la 2ème trame de la page 49.
Voici le code :

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10,11);

void setup() {
  Serial.begin(57600);
  pinMode(8, OUTPUT);
  mySerial.begin(19200);
}

void loop() {
  digitalWrite(8, HIGH); //passage au mode émission
  //trame à envoyer
  const byte data[12]= {0x7E, 0xFF, 0x03, 0x00, 0x02, 0x1F, 0xFF, 0x00, 0x15, 0x3B, 0x3F, 0x7E};
  mySerial.write(data,sizeof(data));
  mySerial.flush();
  Serial.print("taille emise : "); //nombre d'octets envoyés
  Serial.print(sizeof(data));
  
  digitalWrite(8, LOW); //passage au mode réception
  Serial.print(" - taille recue : "); //nombre d'octets reçues
  Serial.print(mySerial.available());
  if(mySerial.available()>=12) {
    char buffer[12];
    mySerial.readBytes(buffer, sizeof(buffer));
    Serial.print(" - octets recus : ");
    Serial.println(mySerial.readBytes(buffer,sizeof(buffer)),HEX);
  }

  delay(2000);
}

Mon problème est que le moniteur série me dit que je reçois une trame de longueur 63 octets (Serial.print(mySerial.available());) est m’affiche un “C” alors que j’émets bien une trame de 12 octets.

Pouvez-vous s’il vous plaît m’aider à comprendre d’où vient le problème ?

Si vous avez besoin d’autres infos, je les fournirai bien sûr.

Je vous remercie pour votre aide ! :slight_smile:

Baptiste

ComLynxUserGuide15THE20110513.pdf (386 KB)

numérisation0002.pdf (503 KB)