Communication Arduino --> BMS (temporisation)

Bonjour à tous,
Je suis dans un projet ou je dois en gros: récupérer des infos d'un BMS sur un arduino, les envoyer sur une BDD hébergée sur une rpi puis envoyer des notifications sur un téléphone. Bref.
En gros le BMS m'envoie deux trame différentes, une qui me donne les tensions de toutes les cellules et qui est sur 28 octets et une autre trame avec des infos plus général.
Je stocke les deux trames dans deux tableaux différents et mon but serait d’arrêter la réception (je travaille sur les broches RX et TX de mon UNO) pendant par exemple 30min et re-lancer le programme pour reprendre les nouvelles infos plus tard.
J'ai essayé avec des delay() mais bien sur après des tests rapides je me rend compte que ce n'est pas du tout viable..
Donc je me suis intéressé au topic ou il y a des exemples avec des millis() pour que ma boucle ne se lance que tout les x temps mais je me heurte au problème de saturation de mon buffer...
Merci d'avance pour votre aide

script.txt (1.89 KB)

Bonjour

mon but serait d'arrêter la réception

Regarder la notice du BMS pour verifier l'existence eventuelle d'un protocole matériel ou logiciel permettant de contrôler le flux et donc suspendre l'émission

Bonjour,
J'ai la doc technique concernant la communication UART du BMS (que je ne peux pas divulguer désolé) mais elle sert "seulement" à traduire la trame que l'on reçoit, exemple: octet de start = 0x55 etc...

je me heurte au problème de saturation de mon buffer...

Tout dépend de quoi on parle : du buffer de l'UART ou de TON buffer.

Dans le premier cas il suffit de lire les caractères et de les ignorer jusqu'à rencontrer le START, ce que fait ton protocole.
Dans le deuxième cas il suffit de ne pas lire les caractères :roll_eyes:

Remarques :
Je ne vois aucune trace de millis() dans ton code.
Je ne vois vraiment pas l'intérêt de stocker START, longueur et CRC dans un buffer séparé.
Il n'y a aucun contrôle de la valeur du CRC.

J'ai la doc technique concernant la communication UART du BMS (que je ne peux pas divulguer désolé)

Pas grave.
Pourtant avec un protocole pareil ils ne risquent pas de se faire copier :smiling_imp:

Dernière remarque : à 9600 baud tu pourrais utiliser un objet SoftwareSerial au lieu du Serial. Dommage ...

J'ai la doc technique concernant la communication UART du BMS (que je ne peux pas divulguer désolé)

C'est plutôt nous qui sommes désolés pour toi, parce quand sans partage de doc sur ce forum l'aid n'est pas la même....
Si un contrôle de flux est disponible côté BMS alors la carte Arduino peut suspendre/relancer l'émission ce serait un façon d e régler le problème.

al1fch:
Si un contrôle de flux est disponible côté BMS alors la carte Arduino peut suspendre/relancer l'émission ce serait un façon d e régler le problème.

Comme je l'ai dit plus haut, il n'y en a pas. J'en ai déjà parlé avec le constructeur du BMS ^^.

Bon en faite je suis désolé, je pense que je vais reformuler mon problème car je me suis mal exprimé.
Le problème du buffer est un ancien problème (je n'ai pas reprit ce projet depuis plus d'une semaine car je bossais sur autre chose donc j'ai fais des erreurs sur le premier post).
Je voudrais juste effectuer deux fois (car le BMS m'envoie deux trame) ma boucle void loop() puis mettre l'arduino au dodo pendant un certain temps.
J'imagine qu'avec un simple for ça ne marche pas (j'imagine pas en faite, j'ai testé et ça n'a rien donné)
HBachetti quand vous dites arrêter de lire vous pouvez vous expliquer svp ?
(Merci de vos réponses hyper rapide à tous)

mettre l'arduino au dodo pendant un certain temps

C'est nouveau.
Il y a différents moyens. La librairie LowPower en est un.
On peut s'inspirer de l'exemple powerDownWakePeriodic

On peut par exemple demander le power-down après réception d'une trame complète et correcte et son traitement.

Merci beaucoup du tuyau, je vais m'informer la dessus et je reviens vers vous !