Bonjour j'ai un code qui fonctionne parfaitement avec mon lien logiciel qui envoie 2 valeurs en même temps à arduino pour faire une Wavforme.
Code:
1
2
3
4
5 #include "Nextion.h" NexWaveform s0 = NexWaveform(0, 21, "s0"); }
Version imprimable
Bonjour j'ai un code qui fonctionne parfaitement avec mon lien logiciel qui envoie 2 valeurs en même temps à arduino pour faire une Wavforme.
Code:
1
2
3
4
5 #include "Nextion.h" NexWaveform s0 = NexWaveform(0, 21, "s0"); }
Un buffer de 1000 octet c'est énorme sur un petit arduino..
=> Quelle est la taille habituelle du message reçu? allouez ce qui est nécessaire pas plusCode:char buffer[1000] = {0};
il vaut mieux éviter Serial.readStringUntil() qui inclut un timeout.
Si vous voulez faire quelque chose de solide, écrivez une fonction asynchrone qui écoute le port série et quand vous avez reçu un message complet, analysez le.
Si vous voulez faire quelque chose de très solide et optimisé en gestion de la mémoire, il faut sans doute éviter la classe String - mais dans un premier temps c'est OK.
pour écrire la fonction d'écoute, il faut savoir quel est le marqueur de fin de message. qu'envoyez vous réellement? est-ce un truc du genre "(12,32,44)" ou "(A; 12,33)" --> la marque de fin de message semble être la parenthèse fermante (et celui de début de message serait une parenthèse ouvrante)
un code comma cela vous donne une idée de l'approche:par exemple si vous tapez dans la console ouverte à 115200 baudsCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 const byte tailleMax = 20; const char marqueurDeDebut = '('; const char marqueurDeFin = ')'; String message; bool getMessage() { if (Serial.available()) { char caractereRecu = Serial.read(); switch (caractereRecu) { case marqueurDeDebut: message = marqueurDeDebut; break; case marqueurDeFin: message += marqueurDeFin; return true; break; case ' ': break; // on ignore les espaces (par exemple) default: message += (char) toupper(caractereRecu); // on conserve tout en majuscules } // éventuellement si la chaîne devient trop longue c'est qu'il y a un souci, on coupe if (message.length() > tailleMax) message = ""; } return false; } void setup() { Serial.begin(115200); message.reserve(tailleMax); } void loop() { if (getMessage()) { Serial.print(F("Message reçu : ")); Serial.println(message); message = ""; // on vide le message une fois traité } }
hflka zjhaflehaf laz(A,12,33)ajkhkzfhkd
le code va juste extraire (A,12,33) et vous devriez voir
Message reçu : (A,12,33)
dans la console série.
Ensuite à vous de jouer pour extraire avec les méthodes de la classe String les éléments qui vous intéressent
j'écrite de mon logiciel pour controlé un slider text ou button la variable (A B C ou D) suivie de ; ensuite j'écrit la valeur text ou chiffre envoyer a arduino qui transmet a mon écran
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 NexWaveform s0 = NexWaveform(0, 21, "s0"); NexDSButton bt0 = NexDSButton(0, 18, "bt0"); NexSlider h0 = NexSlider(0,3,"h0"); NexSlider h1 = NexSlider(0,4,"h1"); NexText t0 = NexText(0,1,"t0"); side.toInt(); } } }
votre souci c'est que vous ne lisez pas l'entrée jusqu'au marqueur de fin (la parenthèse fermante) mais jusqu'à un ';' pour essayer de lire une commande. Le challenge c'est que (E ; 277 E ; 128) comprend 2 lectures pour faire une seule commande. Votre approche ne fonctionne pas.
==> ce serait bcp plus simple d'analyser une commande entière si vous attendez d'avoir reçu tout ce qui se trouve entre parenthèses. c'était ma suggestion
de plus si une commande de type 'E' prend deux paramètres, pourquoi ne pas l'envoyer sous la forme (E ; 123 255) par exemple? à quoi ça sert de répéter le E ?
quand j'envois E ; 123 255 je reçois E 123 255
ben... oui - le code ne demande pas de lire la seconde valeur...
pourquoi ne prenez vous pas l'approche proposée avec les parenthèses pour lire la commande complète?