Bonjour a tous !
Je veux transférer 2 données int via le port série, et les information que j'ai trouver était de les transformer en string, les concaténer, les envoyer, les séparer, puis les transformer en int.
Ca fonctionne mais beaucoup de lige de code sont nécessaire et vu qu’Arduino a une mémoire très limité j'ai chercher une autre solution.
je voudrais que vous me donniez votre avis sur la méthode a laquelle j'ai penser
de base je ne dépasse pas les valeurs de 200
Sur le premier Arduino
int Val_1 = 141
int Val_2 = 197
méthode d'encodage :
unsigned long Val_Te = (Val_1*1000)+Val_2 = 141197
j'envoie int Val_Te
sur le 2eme arduino
Je reçoit unsigned long Val_Tr
int Val_3 = Vat_Tr/1000 => Normalement on à 141
int Val_4 = Val_Tr-(Val_3*1000) => Normalement on à 197
Pouvez vous me dire s'il y a une faille dans mon raisonnement ou si cela peut fonctionner, sachant que je ne dépasse pas des valeur de 200
Si les valeurs restent entre 0 et 255 autant les stocker dans des byte. Ensuite tu peux les concaténer dans un unsigned int (256 * n1 + n2) que tu envoies en une seule fois.
je bloque du coup car quan je fait X = 256*200+200 j’obtiens 51400 et si je met des parenthese j'ai 102400 du coup X ne peut pas être INT
Mais quand je fait un programme je me retrouve avec le resultat suivant X = 4294940280
byte N1 = 150 ;
byte N2 = 120;
unsigned long X;
void setup()
{
Serial.begin(9600);
while (!Serial)
{
Serial.println("en attente de la mise en service de la communication en serie.....");
Serial.println("Arduino est pret");
}
X = 256 * N1 + N2;
Serial.println(X);
}
void loop()
{
}
Pour l'émission sur une ligne série, en quoi le fait de concaténer 2 byte dans un unsigned int est-il plus simple que l'envoi des mêmes 2 byte directement? Surtout que la question initiale concernait la réduction du nombre de lignes de code pour obtenir ledit résultat.
sur toutes les solutions que j'ai trouvé tous le monde concaténais pour l'envois de plusieurs données, je suis donc rester sur le fait que l'on ne pouvais pas envoyer plusieurs données sur le port serie, ou du moin que c'etai la solution la moins gourmande en espace mémoire.
fdufnews:
Pour l'émission sur une ligne série, en quoi le fait de concaténer 2 byte dans un unsigned int est-il plus simple que l'envoi des mêmes 2 byte directement? Surtout que la question initiale concernait la réduction du nombre de lignes de code pour obtenir ledit résultat.
parce qu'il souhaite un envoi en ASCII qui se fait simplement
uint16_t b1, b2;
Serial.println(b2<<8+b1);
et ça ne fait qu'une lecture à faire sans "parsing" ASCII (je suppose que @Thazz veut un décodage "simple" avec juste un Serial.parseInt() ou équivalent)
que vous envoyez en ASCII, non ? par exemple 1 octet 0xFF sera envoyé sous forme de 255, soit 3 octets (le code ascii de 2, de 5 et de 5 - peut être même suivis de '\r' et '\n')
J-M-L:
que vous envoyez en ASCII, non ? par exemple 1 octet 0xFF sera envoyé sous forme de 255, soit 3 octets (le code ascii de 2, de 5 et de 5 - peut être même suivis de '\r' et '\n')
Desoler mais la je n'ai rien compris a la phrase. (une traduction Google très foireuse ?)
Et surtout pourquoi vouloir me faire envoyer de L'ASCII ?
.
Pour recentrer le truc je veux transférer par le port serie des valeur numérique.
.
lecept me donne une solution qui a l'air intéressant mais que je n'arrive pas a mettre en œuvre, surement a cause d'un méconnaissance de l'utilisation des byte.
.
et fdufnew a l'air de dire qu'on peut envoyer les données non concaténer et que cela est plus simple. Mais là encore mes connaissances ne me permettent pas de mettre en œuvre cette solution.
.
Si vous pouvez m'aider a comprendre les deux du coup, je serais interéssé.
Et surtout pourquoi vouloir me faire envoyer de L'ASCII ?
j'avais compris que c'est ce que vous faisiez
les information que j'ai trouver était de les transformer en string, les concaténer, les envoyer, les séparer, puis les transformer en int.
et que pour éviter de les concaténer et séparer vous vouliez envoyer qu'un seul entier (combinaison des 2) mais toujours sous forme de string.
si vous avez byte b = 255;si vous faites Serial.write(b);alors vous envoyez un seul octet en binaire, si vous faites Serial.println(b);alors vous envoyez 5 octets en ASCII (ça envoie les octets '2' '5' '5' '\r’ et ’\n')
La question est donc : que comptez vous faire et comment vous prévoyez de relire les infos de l'autre côté?
ce que je disait c'est que les solution que j'ai trouvais transformais les int en string pour les concaténer en gros ils font cela:
int Val_A = 200, et int Val_B = 150, ils les transforment en string Val_A ="200" et Val_B ="150"
ils les concatènent string Val_C = "200;150"
ils les envois en série, puis les séparent en string, et enfin les retransforment en int
Et tout ça, ça fait beaucoup de code.
Maintenant c'est éclairci que je ne veut pas envoyer d'ASCII mais des nombres qui vont représenter des fréquences.
Ôtez-moi d'un doute la liaison série, telle que configurée par la fonction init() ajoutée par l'IDE arduino ne transmet-elle pas les informations octet par octet (8N1) ?
Ce n'est pas au récepteur à connaître la nature des informations (texte ou nombre) qu'il reçoit ?
Les entiers c'est selon le choix fait à leur déclaration 1, 2 ou 4 octets avec avr-gcc.
Découper un entier de 4 octets en 4 octets "individuel" ou le reconstituer est faisable.
Je pense que c'est bien le sens de la question "essentielle" de J-M-L :
La question est donc : que comptez vous faire et comment vous prévoyez de relire les infos de l'autre côté?
Alors tout ce que vous dites, pour moi c'est du chinois, je ne m'y connais pas assez en infrastructure arduino.
Mais en revanche ce que je veux en faire : se sont des valeurs de fréquences mais bon pour simplifier on va dire que que je veux faire des opérations mathématique dessus +,-,*,/,=