Communication série en USB entre RPi et Arduino Uno

a marqué ce sujet comme résolu.
Auteur du sujet

Bonjour, je souhaite réaliser une communication série entre une Arduino et une RPi via l’USB. Cependant j’ai un petit problème. Je ne reçois pas les bonnes valeurs (et pas toujours les mêmes).J’ai fait un test simple : la RPi envoie un caractère et l’Arduino doit le renvoyer.

Voici le code de l’Arduino :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  while (Serial.available())  {
    Serial.println(Serial.read());
  }
  delay(10);
}

Et celui de la RPi :

 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
33
34
35
#include <stdio.h>
#include <iostream>
#include <wiringSerial.h>

using namespace std;

main ()
{
    int fd = serialOpen ("/dev/ttyACM0", 9600) ;
    if (fd < 0)
    {
        cout << "ERREUR DE CONNEXION" << endl;
        return -1;
    }

    int car = 0;

    cout << "Envoie 'A'..." << endl;
    serialPutchar (fd, 'A') ;
    if((car = serialGetchar(fd)) < 0)
        cout << "ERREUR DE RÉCEPTION" << endl;
    cout << "Reçu : " << (char) car << " (" << car << ")" << endl;

    cout << "Envoie 'b'..." << endl;
    serialPutchar (fd, 'b') ;
    if((car = serialGetchar(fd)) < 0)
        cout << "ERREUR DE RÉCEPTION" << endl;
    cout << "Reçu : " << (char) car << " (" << car << ")" << endl;

    cout << "Envoie 't'..." << endl;
    serialPutchar (fd, 't') ;
    if((car = serialGetchar(fd)) < 0)
        cout << "ERREUR DE RÉCEPTION" << endl;
    cout << "Reçu : " << (char) car << " (" << car << ")" << endl;
}

Et voici ce que j’obtiens :

 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
pi@raspberrypi:~/testCom $ ./a.out
Envoie 'A'...
Reçu : 1 (49)
Envoie 'b'...
Reçu : 1 (49)
Envoie 't'...
Reçu : 6 (54)
pi@raspberrypi:~/testCom $ ./a.out
Envoie 'A'...
ERREUR DE RÉCEPTION
Reçu : ▒ (-1)
Envoie 'b'...
Reçu : 9 (57)
Envoie 't'...
Reçu : 8 (56)
pi@raspberrypi:~/testCom $ ./a.out
Envoie 'A'...
Reçu :
 (10)
Envoie 'b'...
ERREUR DE RÉCEPTION
Reçu : ▒ (-1)
Envoie 't'...
Reçu : 1 (49)

`

Je pense que c’est qqch de tout con, mais je ne vois pas. J’espère que vous pourrez m’aider !

Merci d’avance, Siméon.

La curiosité est le plus beau des défauts

+0 -0
Auteur du sujet

J’ai enlevé le delay et j’ai rajouté une tempo entre les envoies (bon à l’arrache, j’ai for un for qui compte 100 000 :D) mais ça ne change rien. J’ai toujours les mêles résultats :/

La curiosité est le plus beau des défauts

+0 -0

j’arrive peut-être un peu tard, mais si jamais…

strictement les mêmes effets, ou quelque chose d’un peu aléatoire, peu prévisible?

question un peu bête surement, pourquoi dans le code de la RPi déclarer la variable contenant le caractère reçu comme un int, surtout si c’est pour le caster en char après?

autre idée du même style, es-tu sûr que ta liaison série est bien sur ce port, côté raspberry Pi?

si tout ce qui est erreur bête du style de ce que je t’ai sorti au-dessus est absent, selon moi, (mais je peux aussi me tromper) le problème viendrait peut-être du fait de tester la réception d’un caractère une seule fois sur le raspberry Pi et sans pause avant alors qu’il est évident que l’arduino prendra plus de temps à répondre que ce que la RPi va lui laisser : après la réception du char par l’arduino, il doit l’affecter à une zone en mémoire, puis l’y lire, et la rebalancer dans la liaison série, là où la raspberry Pi a besoin de beaucoup moins de temps pour ne rien en faire. c’est ce ui me fait dire que l’arduino aura jamais le temps de renvoyer le char avant que le raspberry Pi puisse tester une éventuelle réception. une manière selon moi pour tester ça serait de mettre une attente sur la RPi avant le test de réception du retour du char. ce qui me fait dire ça, c’est que lors de ton premier test, pour les char 'A' et 'b’, il n’y a pas eu de différence de retour.

ensuite, on peut remarquer que tes retours ne sont pas des codes ascii de lettres, mais de chiffres. donc ta liaison série est peut-être mal configurée d’un des deux cotés (little endian ou big endian, bref dans quel ordre sont envoyés les 1 et les 0…). pis ça reste assez difficile à vérifier tant que la réponse semble pas corrélée à l’envoi.

sinon, ca pourrait etre utile de savoir ce que reçoit vraiment l’arduino, donc si tu peux y brancher 8 leds pour afficher ce qu’il a compris de chaque lettre envoyée par la RPi…

Édité par remace

Oui. Non. Attends, je regarde mieux et je te dis.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte