Précédent   Forum du club des développeurs et IT Pro > Général Développement > Programmation système > Embarqué
Embarqué Forum d'entraide sur la programmation des systèmes embarqués
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/10/2012, 14h21   #1
ssssa1983
Invité de passage
 
said said
Inscription : août 2010
Messages : 16
Détails du profil
Informations personnelles :
Nom : said said

Informations forums :
Inscription : août 2010
Messages : 16
Points : 0
Points : 0
Par défaut lecture du port serie

Bonjour à tous,

J'ai fait le programme suivant pour envoyer une ligne de commande au port serie , puis récupérer la réponse. mais malheureusement, je n'arrive pas à récupérer l'information.
Code :
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
#include        <stdio.h>
#include	<opencv/highgui.h>
#include	<fcntl.h>


int main()
{
int _platine;
int entete;
     _platine = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);

      if(_platine <0)
        {       perror("Erreur d'ouverture du port serie");
                 exit(-1);
        }
      else
        {
          write(_platine,"VLIM\r",5);
          read(_platine, &entete, sizeof(entete)-1);

                  printf ("VLIM = %d", entete);

         }

}
Je récupère toujour la valeur 0, normalement je dois récuperer la valeur 2500.
ssssa1983 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2012, 20h57   #2
Aquanum
Rédacteur/Modérateur
 
Avatar de Aquanum
 
Homme Yoann Sculo
Ingénieur Linux Embarqué
Inscription : janvier 2006
Messages : 686
Détails du profil
Informations personnelles :
Nom : Homme Yoann Sculo
Âge : 26
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur Linux Embarqué
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : janvier 2006
Messages : 686
Points : 2 615
Points : 2 615
Il te faudrait un peu plus de gestion d'erreur pour nous aiguiller.
  • Essaie de tester le retour des write et read. Comme ça tu vérifies que l'écriture a bien marché, et que tu lis bien le bon nombre d'octets.
  • Pourquoi lis-tu 3 octets ?
  • Tu reçois bien un int ? Pas un short ? Essaie de faire un read de char par char en affichant le résultat en hexa : "%.02X"
  • Oublie pas ton \n à la fin de ton printf
  • Oublie pas le close à la fin
  • Où as-tu réglé ton baudrate ? Ton termios est déjà configuré ?

Un truc du genre :
Code :
1
2
3
4
5
6
7
8
int ret;
unsigned char c;

while (1) {
    ret = read(_platine, &c, 1);
    printf("read (%d) : %.02X\n", ret, c);
}
__________________
Modérateur forum Système Embarqués
Blog - Projets - Articles - Github
Aquanum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2012, 16h58   #3
Livegen
Membre habitué
 
Avatar de Livegen
 
Homme
Ingénieur logiciel embarqué Franco-allemand
Inscription : avril 2008
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Allemagne

Informations professionnelles :
Activité : Ingénieur logiciel embarqué Franco-allemand
Secteur : Industrie

Informations forums :
Inscription : avril 2008
Messages : 46
Points : 115
Points : 115
meme avis que le modérateur ci-dessus.

Après pour le read = 0, je pense que le problème vient de l option O_NDELAY lorsque tu récupères le file descriptor, le read est alors non-bloquant. En conséquence lorsque tu fais une lecture, read t indique qu il n a rien dans son buffer UART car ton périphérique ne t as pas encore répondu.

Meilleures salutations.
Livegen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2012, 18h08   #4
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 709
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur systèmes embarqués
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2009
Messages : 1 709
Points : 4 192
Points : 4 192
Si tu essayes de lire ce que tu viens d'écrire, il me semble que ce n'est pas possible. Si j'ai bonne mémoire, j'ai lu un sujet sur Developpez où le PO voulait faire ça et quelqu'un avait répondu que écrire sur le port série donne un signal au fil TX et que le lire lit le signal du fil RX. S'ils ne sont pas reliés, il n'y a pas de raison que le signal de sortie boucle sur l'entrée.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2012, 11h27   #5
ssssa1983
Invité de passage
 
said said
Inscription : août 2010
Messages : 16
Détails du profil
Informations personnelles :
Nom : said said

Informations forums :
Inscription : août 2010
Messages : 16
Points : 0
Points : 0
Par défaut Vous avez raison

Enfin j'ai trouver la solution: il me fallait déclarer buffer (entete) en tant que tableau et rajouter la fonction :
Code :
1
2
3
char buffer[255];  /* Input buffer */
fcntl(fd, F_SETFL, 0);
donc mon programme final est (peut être ça va servir d'autres personnes) :

Code :
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
#include <iostream>
#include <stdio.h>   /* Standard input/output definitions */
#include <fcntl.h>   /* File control definitions */

using namespace std;

int main(void)
{
char buffer[255];  /* Input buffer */

int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
         if (fd == -1) 
           {
                perror("open_port: Unable to open /dev/ttyS0 - ");
                return 1;
            } 
        else 
            {
                fcntl(fd, F_SETFL, 0);
           
                write(fd, "VLIM\r",5);
                read(fd, buffer, sizeof(buffer) - 1);
                cout << buffer << endl;

                close(fd);

                  } 
   return (0);
}
ssssa1983 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2012, 14h14   #6
Aquanum
Rédacteur/Modérateur
 
Avatar de Aquanum
 
Homme Yoann Sculo
Ingénieur Linux Embarqué
Inscription : janvier 2006
Messages : 686
Détails du profil
Informations personnelles :
Nom : Homme Yoann Sculo
Âge : 26
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur Linux Embarqué
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : janvier 2006
Messages : 686
Points : 2 615
Points : 2 615
Ravi que ça fonctionne.

Néanmoins, je suis curieux. Je ne comprends pas trop ce qu'apporte l'appel à fcntl qui va si je ne m'abuse paramétrer ton file descriptor à 0 (O_RDONLY). En faisant ça tu écrases complètement ta configuration. Généralement, fcntl et F_SETFL est plutôt utilisé avec F_GETFL pour ne pas perdre ta configuration initiale.

Bref, dans la mesure où tu es en O_RDWR et O_NDELAY (=O_NONBLOCK) j'ai du mal à comprendre en quoi l'appel à fcntl corrige le problème.

Je me mettrais bien dans les mêmes conditions pour tester, mais je n'ai pas le même contexte. Si quelqu'un a une explication, je suis preneur.

Quoi qu'il en soit, ssssa1983 si tu peux le faire, je te conseille vivement de gérer tous les cas d'erreurs. Ça n'en sera que mieux pour les potentielles prochaines erreurs.
__________________
Modérateur forum Système Embarqués
Blog - Projets - Articles - Github
Aquanum est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h27.


 
 
 
 
Partenaires

Hébergement Web