N'interroger un port série qu'à la demande

Bonsoir,

je cherche à interroger le port série d'un contrôleur de charge solaire, il s'agit d'un Smart Solar 75/15 de Victron qui dispose d'une sortie série en clair (Ve.Direct), qui envoie une trame toutes les secondes avec les informations utiles.

Mon code me permet aisément d'analyser chaque trame, mais je n'ai pas besoin de l'interroger toutes les secondes, je préférais ne tenir compte de cette source d'information qu'à la demande (et ignorer les autres trames) et disposer du temps libre pour faire tourner des trucs qui durent plus d'une seconde ou tout simplement dormir (sleep_8s) pour économiser de la batterie.

J'ai donc deux problèmes:
Comment interroger plutôt que de subir les envois
Comment inhiber les interruptions afin de "dormir"


#include <Wire.h>
#include <SoftwareSerial.h>



String label, val;
int tension;

SoftwareSerial mySerial(2, 3); // RX, TX

void setup()  
{
  Serial.begin(19200);
  mySerial.begin(19200);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(13, OUTPUT);
} 

void loop() 
{
  
  if (mySerial.available())
   {

        label = mySerial.readStringUntil('\t');      
        val = mySerial.readStringUntil('\r\r\n');
       if (label == "V"){
          tension = val.toInt();
          Serial.println(tension);
          
          //activité série
          digitalWrite(13, HIGH);
          delay(50);
          digitalWrite(13, LOW);
          
          //soir
          if (tension < 12000){
          digitalWrite(4, LOW);
          digitalWrite(5, HIGH);
          }
          
          //matin
          if (tension > 13000){
          digitalWrite(5, LOW);
          digitalWrite(4, HIGH);
          
          }
        
        }

  
  
}

}

Merci

Philippe

Solution hardware. Câbler une sortie sur une ligne vers votre périphérique, gérer ce signal en RTS/CTS.
Solution softawre. Envoyer au périphérique les caractères XON/XOFF.
Regarder la doc de votre périphérique pour voir ce qu'il admet comme protocole sur sa ligne série.

Bonjour

Dans la documentation c'est l'existence eventuelle d'un "contrôle de flux" qui est à chercher (RTS/CTS ou Xon Xoff) permettant de suspendre/reprendre l'émission des trames.

Ceci dit votre programme n'est pas obligé de prendre en compte et traiter tout ce qui arrive sur le port série.
Actuellement le programme reboucle tout de suite sur

if (mySerial.available())

l'écoute et le traitement des trames se fait 'à temps complet' !

Bonjour,

Pour ne plus recevoir tu peux faire un Serial.end(). Le problème c'est que le chargeur va continuer à envoyer et au redémarrage de la communication, il faudra te resynchroniser.
Le mieux serai de continuer à recevoir, mais ne pas traiter les messages si tu n'en as pas besoin.

remarque: dans val = mySerial.readStringUntil('\r\r\n');, '\r\r\n' n'est pas un caractère. Le compilateur aurait du donner une erreur ou au minimum un warning.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.