# Communication UART transfert données dans variable

**URL:** <https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856>\
**Category:** Français\
**Created:** [November 28, 2022, 6:56am UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856 "2022-11-28T06:56:21Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![wawann](https://avatars.discourse-cdn.com/v4/letter/w/a88e4f/32.png) [@wawann](https://forum.arduino.cc/u/wawann)\
**Post date:** [November 28, 2022, 6:56am UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/1 "2022-11-28T06:56:21Z")

</div>

Bonjour,

Je suis en train de communiquer d'un raspberry vers un arduino mega en USB et je me suis rendu compte que les infos transmises initialement n'était pas correctement assimilées par le code arduino (données de 0 à 65535 coté raspberry, mais arduino relit de -32766 à 32768 environ) ==\> chose qui ne me convient pas.

J'ai cependant réussi à contourner cette problématique en adaptant le code, mais je n'arrive à correctement affecter la valeur envoyée à une variable de l'arduino.

le code est le suivant (il permet bien de récupérer les données =\> visible dans le moniteur) :

```cpp
void loop() {
  if (Serial.available() ) 
  {
    int datalength = Serial.readBytes(buf, BUFFER_SIZE);
    {
       for(int i = 0; i < datalength; i++)
        {
             Serial.print(buf[i]);
        }
    }
  }
}

```

J'avais eu l'idée de mettre un : variable = Serial.print(buf[i]) mais ça casse le réassemblage de la donnée.  
Comment je peux faire pour qu'a la fin de la boucle for, je puisse affecter le contenu du tableau à une variable ?

En vous remerciant.

---

<div class="post-metadata">

**Author:** ![terwal](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/terwal/32/1098571_2.png) [@terwal](https://forum.arduino.cc/u/terwal)\
**Post date:** [November 28, 2022, 9:08am UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/2 "2022-11-28T09:08:35Z")

</div>

> [@wawann](#):
>
> variable = Serial.print(buf[i])

Bonjour, pour commencer variable = Serial.print(buf[i]) signifie que tu veux affecter à la variable "variable" la valeur de retour de la fonction d'affichage, qui je crois est "void" (aucun retour).

Je suppose que ce n'est pas le code que tu donne qui affiche une valeur sur 16bits.  
Le soucis que tu rencontre est que la valeur "binaire" est assigné au mauvais [type](https://www.tutorialspoint.com/arduino/arduino_data_types.htm) "int" au lieu d'un " Unsigned int"

---

<div class="post-metadata">

**Author:** ![fdufnews](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/fdufnews/32/238836_2.png) [@fdufnews](https://forum.arduino.cc/u/fdufnews)\
**Post date:** [November 28, 2022, 10:12am UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/3 "2022-11-28T10:12:00Z")

</div>

Il pourrait y avoir une autre cause au problème.  
Tu codes sur 2 plateformes différentes et le type int est plateforme dépendant.  
Si tu veux échanger des données entre 2 plateformes différentes et avoir le contrôle sur le type de celles-ci, il faut :

- soit échanger les valeurs en texte avec des printf(), et faire la conversion avec atoi() à la réception
- soit échanger les valeurs en binaire avec des write(). Dans ce cas pour maitriser le format des données utiliser des types non ambigus, uint16\_t par exemple pour passer des entiers non signés sur 16 bits.

Il faut aussi définir un minimum de protocole pour savoir retrouver les données afin de reconstruire les nombres correctement.

---

<div class="post-metadata">

**Author:** ![wawann](https://avatars.discourse-cdn.com/v4/letter/w/a88e4f/32.png) [@wawann](https://forum.arduino.cc/u/wawann)\
**Post date:** [November 28, 2022, 10:25am UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/4 "2022-11-28T10:25:50Z")

</div>

Bonjour, merci pour vos réponses.  
Typiquement coté raspberry, j'envoie les datas via :

```cpp
#code python
val = 592100 # une valeur comprise entre 0 et 65535
ser.write(str(val).encode('utf-8')+b'\n')

```

coté arduino, j'utilise le code du premier poste et il reçoit bien la valeur envoyée, mais chiffre par chiffre. Ce qui est normal, mais j'aimerai concaténer les valeurs reçues afin d'affecter la valeur envoyée (dans l'exemple 592100) à la variable.  
Je vais essayer avec strcat...

---

<div class="post-metadata">

**Author:** ![terwal](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/terwal/32/1098571_2.png) [@terwal](https://forum.arduino.cc/u/terwal)\
**Post date:** [November 28, 2022, 10:41am UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/5 "2022-11-28T10:41:47Z")

</div>

> [@fdufnews](#):
>
> Il pourrait y avoir une autre cause au problème.  
> Tu codes sur 2 plateformes différentes et le type int est plateforme dépendant.

Oui est non, l'ordre du poids fort ou fiable, change la valeur mais le signe, si les ombres sont signé des deux cotés.

---

<div class="post-metadata">

**Author:** ![terwal](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/terwal/32/1098571_2.png) [@terwal](https://forum.arduino.cc/u/terwal)\
**Post date:** [November 28, 2022, 10:45am UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/6 "2022-11-28T10:45:37Z")

</div>

Si tu lit caractère par caractère coté Arduino, c'est que le problème vient de ta sérialisation du coté python.  
Désolé, avec ton code, je ne vois d'où peut venir le problème.  
Peut être que si tu affiche exactement ce que tu envois et tu reçois ?

---

<div class="post-metadata">

**Author:** ![wawann](https://avatars.discourse-cdn.com/v4/letter/w/a88e4f/32.png) [@wawann](https://forum.arduino.cc/u/wawann)\
**Post date:** [November 28, 2022, 11:02am UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/7 "2022-11-28T11:02:50Z")

</div>

voici le code coté raspberry :

```cpp
#!/usr/bin/env python
#executer avec python3

import epics
import time
import serial

if __name__ == ' __main__':
	ser = serial.Serial('/dev/ttyACM0', 115200, timeout=1)
	while True:
		val = 59210
		print ("rpi =",val)
		ser.write(str(val).encode('utf-8')+b'\n')
		time.sleep(0.5)
		line = ser.readline().decode('utf-8')
		print (line)

```

ici le code arduino :

```cpp

unsigned char prescaler = 0b00001101; // variable d'ajustement du prescaler en fonction de la valeur de frequence
int valeur = 65535; // frequenceInt 
int prescal = 0;
const int BUFFER_SIZE = 50;
char buf[BUFFER_SIZE];
char val[5];

void setup () {
  delay(10000);
  Serial.begin(115200);
  }
 
// =================
// Boucle principale
// =================
void loop () 
{
  if (Serial.available()) // ici on regarde si qqechose vient de l USB
  {
    int rlen = Serial.readBytes(buf, BUFFER_SIZE);
    for(int i = 0; i < rlen; i++)
    {
      Serial.println(buf[i]);
    }

  }

}

```

et le retour moniteur en image piece jointe :

 ![Capture](https://europe1.discourse-cdn.com/arduino/original/4X/9/0/5/905c60d69f624b3eb1b0c9edd00392ba9e521ab0.png)

---

<div class="post-metadata">

**Author:** ![jpbbricole](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/jpbbricole/32/606025_2.png) [@jpbbricole](https://forum.arduino.cc/u/jpbbricole)\
**Post date:** [November 28, 2022, 11:12am UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/8 "2022-11-28T11:12:07Z")

</div>

Bonjour wawann

Essaies de lire ton port série avec `Serial.readStringUntil('\n');` ainsi:

```cpp
unsigned char prescaler = 0b00001101; // variable d'ajustement du prescaler en fonction de la valeur de frequence
int valeur = 65535; // frequenceInt
int prescal = 0;
const int BUFFER_SIZE = 50;
char buf[BUFFER_SIZE];
char val[5];

void setup () {
	delay(10000);
	Serial.begin(115200);
}

// =================
// Boucle principale
// =================
void loop ()
{
	if (Serial.available()) // ici on regarde si qqechose vient de l USB
	{
		String chiffreRecuSerie = Serial.readStringUntil('\n');
		chiffreRecuSerie.trim(); // Ecentuellement pour nettoyer la réception
		long chiffreRecu = chiffreRecuSerie.toInt();
	}

}

```

C'est pas essayé "en vrai" 😉

Cordialement  
jpbbricole

---

<div class="post-metadata">

**Author:** ![terwal](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/terwal/32/1098571_2.png) [@terwal](https://forum.arduino.cc/u/terwal)\
**Post date:** [November 28, 2022, 12:11pm UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/9 "2022-11-28T12:11:10Z")

</div>

Pour debugger, il serait plus intéressant d'afficher "str(val).encode('utf-8')+b'\n'"

En tous cas ton output me semble correspondre à tes attentes 🙂  
tu envoi 59210 et tu reçois bien 5 9 2 1 0 + un caractère, peut être le \n, mais je n'ai pas l'impression.

---

<div class="post-metadata">

**Author:** ![hbachetti](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hbachetti/32/238810_2.png) [@hbachetti](https://forum.arduino.cc/u/hbachetti)\
**Post date:** [November 28, 2022, 12:37pm UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/10 "2022-11-28T12:37:02Z")

</div>

Salut.

> [@wawann](#):
>
> ```arduino
> int rlen = Serial.readBytes(buf, BUFFER_SIZE);
> for(int i = 0; i < rlen; i++)
> {
> Serial.println(buf[i]);
> }
> 
> ```

Avec ce code, tu lis bien une suite d'octets qui correspond à ce qu'envoie le code PYTHON.  
Mais il y a deux problèmes :

- ce que tu lis est de l'ASCII, c'est à dire "59210\n"
- un timeout de 1s allonge le temps de lecture, car ton code C ne tient pas compte du '\n'

Si tu veux convertir la valeur "59210\n" en valeur numérique, utilise atol(), ou mieux, [strtol()](https://koor.fr/C/cstdlib/strtol.wp)

Si tu veux éliminer la seconde d'attente, utilise [Serial.readBytesUntil()](https://www.arduino.cc/reference/en/language/functions/communication/serial/readbytesuntil/) au lieu de Serial.readBytes()

` int rlen = Serial.readBytesUntil('\n', buf, BUFFER_SIZE);`

---

<div class="post-metadata">

**Author:** ![wawann](https://avatars.discourse-cdn.com/v4/letter/w/a88e4f/32.png) [@wawann](https://forum.arduino.cc/u/wawann)\
**Post date:** [November 28, 2022, 12:43pm UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/11 "2022-11-28T12:43:13Z")

</div>

alors en utilisant le code :

```cpp
void loop () 
{
  if (Serial.available()) // ici on regarde si qqechose vient de l USB
  {
    String chiffrerec = Serial.readStringUntil('\n');
    chiffrerec.trim();
    long chiffre = chiffrerec.toInt();
    Serial.println(chiffre);
  }
}

```

cela me retourne la même chose qu'avec le précédent code, c'est à dire :

 ![Capture](https://europe1.discourse-cdn.com/arduino/original/4X/9/0/5/905c60d69f624b3eb1b0c9edd00392ba9e521ab0.png)

Comment faire pour réassemble les chiffres 5 9 2 ... ?

---

<div class="post-metadata">

**Author:** ![hbachetti](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hbachetti/32/238810_2.png) [@hbachetti](https://forum.arduino.cc/u/hbachetti)\
**Post date:** [November 28, 2022, 12:51pm UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/12 "2022-11-28T12:51:26Z")

</div>

> [@wawann](#):
>
> ```arduino
> val = 592100 # une valeur comprise entre 0 et 65535
> 
> ```

Il y a probablement un zéro de trop ...

Si tu veux convertir un nombre \<= 65535, tu as deux solutions :

- utiliser un type long et atol() ou strtol(), car 65535 ne tiendra pas dans un int
- utiliser un type unsigned int et sscanf()

```arduino
unsigned int var;
sscanf(buf, "%u", &var);

```

Attention le type de la variable var doit être correct :  
%u : unsigned int  
%d : int  
%l : long.

> **[C library function - scanf()](https://www.tutorialspoint.com/c_standard_library/c_function_scanf.htm)**
>
> C library function scanf() - The C library function int scanf(const char \*format, ...) reads formatted input from stdin.

De plus ,tu peux tester la valeur retournée par sscanf(). Elle retourne le nombre d'éléments scannés, dans ton cas : 1.

---

<div class="post-metadata">

**Author:** ![jpbbricole](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/jpbbricole/32/606025_2.png) [@jpbbricole](https://forum.arduino.cc/u/jpbbricole)\
**Post date:** [November 28, 2022, 12:53pm UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/13 "2022-11-28T12:53:34Z")

</div>

Bonjour wawann

> [@wawann](#):
>
> Comment faire pour réassemble les chiffres 5 9 2 ... ?

La variable **chiffre** (`long chiffre = chiffrerec.toInt();`) contient le rassemblement.  
`Serial.println(chiffre);`

Cordialement  
jpbbricole

---

<div class="post-metadata">

**Author:** ![wawann](https://avatars.discourse-cdn.com/v4/letter/w/a88e4f/32.png) [@wawann](https://forum.arduino.cc/u/wawann)\
**Post date:** [November 28, 2022, 12:54pm UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/14 "2022-11-28T12:54:21Z")

</div>

Effectivement pour le 592100 , mon doit a un peu forcé sur la touche... je veux toujours une valeur inférieur à 65535.

---

<div class="post-metadata">

**Author:** ![hbachetti](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hbachetti/32/238810_2.png) [@hbachetti](https://forum.arduino.cc/u/hbachetti)\
**Post date:** [November 28, 2022, 12:56pm UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/15 "2022-11-28T12:56:08Z")

</div>

> [@wawann](#):
>
> Comment faire pour réassemble les chiffres 5 9 2 ... ?

La question est vague.  
Soit tu veux concaténer 5, 9, 2, etc. dans une chaîne, et ça c'est déjà fait.  
Soit tu veux les transformer en valeur numérique, et je t'ai donné plusieurs solutions.

---

<div class="post-metadata">

**Author:** ![wawann](https://avatars.discourse-cdn.com/v4/letter/w/a88e4f/32.png) [@wawann](https://forum.arduino.cc/u/wawann)\
**Post date:** [November 28, 2022, 12:59pm UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/16 "2022-11-28T12:59:49Z")

</div>

un autre test que j'avais fait précédement c'est :

```cpp
if (Serial.available())
{
   valeur = Serial.readStringUntil('\n').toInt();
   Serial.println(valeur); // ou Serial.print(valeur);
}

```

qui me retourne les valeurs entre -32XXX et +32XXX

![Capture2](https://europe1.discourse-cdn.com/arduino/original/4X/c/a/7/ca7cc1fbe4210f4106a7680ba9f40f5b70bfdcd6.png)

dans l'idée cette solution me convenait bien, mais j'aurai voulu avoir des valeurs de 0 à 65535..

---

<div class="post-metadata">

**Author:** ![wawann](https://avatars.discourse-cdn.com/v4/letter/w/a88e4f/32.png) [@wawann](https://forum.arduino.cc/u/wawann)\
**Post date:** [November 28, 2022, 1:00pm UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/17 "2022-11-28T13:00:38Z")

</div>

Merci, je suis en train de regarder tes propositions.

---

<div class="post-metadata">

**Author:** ![wawann](https://avatars.discourse-cdn.com/v4/letter/w/a88e4f/32.png) [@wawann](https://forum.arduino.cc/u/wawann)\
**Post date:** [November 28, 2022, 1:04pm UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/18 "2022-11-28T13:04:02Z")

</div>

Ok ça semble marcher avec unsigned valeur...

Merci pour votre aide !

---

<div class="post-metadata">

**Author:** ![hbachetti](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hbachetti/32/238810_2.png) [@hbachetti](https://forum.arduino.cc/u/hbachetti)\
**Post date:** [November 28, 2022, 1:04pm UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/19 "2022-11-28T13:04:45Z")

</div>

> [@wawann](#):
>
> et le retour moniteur en image piece jointe :

Tout d'abord ce n'est pas le moniteur, c'est le terminal dans lequel tu as lancé PYTHON

> [@wawann](#):
>
> ```arduino
> line = ser.readline().decode('utf-8')
> 
> ```

Ton problème se situe côté PYTHON.  
ser.readline() attend une chaîne terminée par '\n', mais là je ne vois pas de prime abord pourquoi print() affiche un seul caractère à la fois.

---

<div class="post-metadata">

**Author:** ![jpbbricole](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/jpbbricole/32/606025_2.png) [@jpbbricole](https://forum.arduino.cc/u/jpbbricole)\
**Post date:** [November 28, 2022, 1:09pm UTC](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856/20 "2022-11-28T13:09:40Z")

</div>

Bonjour wawann

> [@wawann](#):
>
> `valeur = Serial.readStringUntil('\n').toInt();`

Comment est déclarée la variable valeur?

Dans ma proposition:

```arduino
		String chiffreRecuSerie = Serial.readStringUntil('\n');
		chiffreRecuSerie.trim(); // Ecentuellement pour nettoyer la réception
		long chiffreRecu = chiffreRecuSerie.toInt();

```

`chiffreRecuSerie.toInt();` retourne, en réalité, une variable de type long.

Cordialement  
jpbbricole

[Next page](https://forum.arduino.cc/t/communication-uart-transfert-donnees-dans-variable/1058856.md?page=2)
