Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    mai 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : mai 2015
    Messages : 30
    Points : 9
    Points
    9

    Par défaut Données ASCII à modifier vers données hexadécimales

    Bonjour,

    J'essaye de faire fonctionner ce petit programme en "C" ( mais je suis débutant ).
    Il s'agit d'un projet de lecture d'une valeur qui arrive sur le port RS232.
    Cette valeur est copiée dans un fichier temporaire avant que celui-ci ne soit effacé après lecture par la macro qui l'utilise.

    Cela fonctionne avec une chaîne en valeurs numériques, mais pas avec une chaîne de caratères Hexadécimaux.

    Comment modifier ce programme "C" pour qu'il accepte d'envoyer telle quelle la chaîne hexadécimale reçue ?

    Petit example :

    Si la chaîne de test reçu sur le port RS232 est "FF",
    les caractères reçus dans le fichier temporaire sont un petit carré avec O1 à l'intérieur et Y surmonté de 2 points.

    Je souhaite recevoir du texte brut sans décodage "FF"

    Je précise que je suis sur Ubuntu et que la macro est réalisée en Basic LibreOffice ou OpenOffice.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    #include <stdio.h>
    #include <string.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <termios.h>
    #include <unistd.h>
    #include <sys/ioctl.h>
     
    #define RX_MSG_MAX_LEN       512
    #define RX_DATA_FILE_MAX_LEN 512
    #define RX_LOCK_FILE_MAX_LEN 512
     
    static void CreateRxDataFile(char *FileName, char *Data);
    static int  LockFileExists(char *FileName);
    static void CreateLockFile(char *FileName);
     
    int main(int argc,char** argv)
    {
      struct termios tio;
      struct termios stdio;
      struct termios old_stdio;
      int tty_fd, Idx = 0, Ret, ExitVal = 1;
      char RxMsg[RX_MSG_MAX_LEN + 1];
      char RxDataFile[RX_DATA_FILE_MAX_LEN + 1];
      char RxLockFile[RX_DATA_FILE_MAX_LEN + 1];
      unsigned char c = 'D';
     
      if(argc < 5)
      {
        printf("Please start with %s /dev/ttyS1 19200 rxdata.txt lock.txt (for example)\n", argv[0]);
      }
      else
      {
        strncpy(RxDataFile, argv[3], RX_DATA_FILE_MAX_LEN);
        printf("RxDataFile=%s\n", RxDataFile);
        strncpy(RxLockFile, argv[4], RX_LOCK_FILE_MAX_LEN);
        printf("RxLockFile=%s\n", RxLockFile);
        tcgetattr(STDOUT_FILENO, &old_stdio);
        memset(&stdio, 0, sizeof(stdio));
        stdio.c_iflag = 0;
        stdio.c_oflag = 0;
        stdio.c_cflag = 0;
        stdio.c_lflag = 0;
        stdio.c_cc[VMIN] = 1;
        stdio.c_cc[VTIME] = 0;
        tcsetattr(STDOUT_FILENO, TCSANOW, &stdio);
        tcsetattr(STDOUT_FILENO, TCSAFLUSH, &stdio);
        fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);       /* make the reads non-blocking */
     
        memset(&tio, 0, sizeof(tio));
        tio.c_iflag = 0;
        tio.c_oflag = 0;
        tio.c_cflag = CS8 | CREAD | CLOCAL;           /* 8n1, see termios.h for more information */
        tio.c_lflag = 0;
        tio.c_cc[VMIN] = 1;
        tio.c_cc[VTIME] = 5;
     
        tty_fd=open(argv[1], O_RDWR | O_NONBLOCK);
        if(!strcmp(argv[2], "115200"))
        {
          cfsetospeed(&tio, B115200);            /* 115200 baud */
          cfsetispeed(&tio, B115200);            /* 115200 baud */
        }
        else if(!strcmp(argv[2], "57600"))
        {
          cfsetospeed(&tio, B57600);            /* 57600 baud */
          cfsetispeed(&tio, B57600);            /* 57600 baud */
        }
        else if(!strcmp(argv[2], "38400"))
        {
          cfsetospeed(&tio, B38400);            /* 38400 baud */
          cfsetispeed(&tio, B38400);            /* 38400 baud */
        }
        else if(!strcmp(argv[2], "19200"))
        {
          cfsetospeed(&tio, B19200);            /* 19200 baud */
          cfsetispeed(&tio, B19200);            /* 19200 baud */
        }
        else if(!strcmp(argv[2], "9600"))
        {
          cfsetospeed(&tio, B9600);            /* 9600 baud */
          cfsetispeed(&tio, B9600);            /* 9600 baud */
        }
        else if(!strcmp(argv[2], "4800"))
        {
          cfsetospeed(&tio, B4800);            /* 4800 baud */
          cfsetispeed(&tio, B4800);            /* 4800 baud */
        }
        else if(!strcmp(argv[2], "2400"))
        {
          cfsetospeed(&tio, B2400);            /* 2400 baud */
          cfsetispeed(&tio, B2400);            /* 2400 baud */
        }
        else if(!strcmp(argv[2], "1200"))
        {
          cfsetospeed(&tio, B1200);            /* 1200 baud */
          cfsetispeed(&tio, B1200);            /* 1200 baud */
        }
        else
        {
          /* default is 115200 */
          cfsetospeed(&tio, B115200);            /* 115200 baud */
          cfsetispeed(&tio, B115200);            /* 115200 baud */
        }
        tcsetattr(tty_fd, TCSANOW, &tio);
        while (c != 'q')
        {
      /*	if (read(tty_fd,&c,1)>0)        write(STDOUT_FILENO,&c,1);  if new data is available on the serial port, print it out */
          Ret = 0;
          if (read(tty_fd, &c, 1) > 0)
          {
    	if( ((c == 10) && Idx) || ((c == 13) && Idx) || (Idx >= RX_MSG_MAX_LEN))
    	{
    	  RxMsg[Idx] = 0;
    	  Idx = 0;
    	  Ret = 1;
    	}
    	else
    	{
    	  if((c != 10) && (c != 13))
    	  {
    	    RxMsg[Idx] = c;
    	    Idx++;
    	  }
    	}
          }
          if(Ret)
          {
    	Ret = 0;
    	printf("Rx: '%s'\n\r", RxMsg);
            while(LockFileExists(RxLockFile))
    	{
    	  usleep(5);/* Wait until calc reads the data.txt file and removes the lock.txt file. */
    #if 1
    	  if(read(STDIN_FILENO, &c, 1) > 0) /* Allow to quit with q in the console */
    	  {
    	    if(c == '&') break;
    	  }
    #endif
    	}
    	CreateRxDataFile(RxDataFile, RxMsg);
            CreateLockFile(RxLockFile);
          }
          usleep(5);
          if (read(STDIN_FILENO, &c, 1) > 0) Ret = write(tty_fd,&c,1);        /* if new data is available on the console, send it to the serial port */
        }
        close(tty_fd);
        tcsetattr(STDOUT_FILENO, TCSANOW, &old_stdio);
        ExitVal = 0;
      }
      return ExitVal;/* EXIT_SUCCESS; */
    }
     
    static void CreateRxDataFile(char *FileName, char *Data)
    {
      FILE *f;
     
      f = fopen(FileName, "w");
      if (f == NULL)
      {
          printf("Error opening file!\n");
          return;
      }
      /* print some text */
      fprintf(f, "%s\n", Data);
      /* Do not forget to close the file */
      fclose(f);
    }
     
    static void CreateLockFile(char *FileName)
    {
      FILE *f;
     
      f = fopen(FileName, "w");
      if (f == NULL)
      {
          printf("Error opening lock file!\n");
          return;
      }
      /* print some text */
      fprintf(f, "%s\n", "DataAvailable");
      /* Do not forget to clode the file */
      fclose(f);
    }
     
    static int LockFileExists(char *FileName)
    {
      FILE *fp;
      int Exists = 1;
     
      fp = fopen(FileName, "r");
      if (fp == NULL) {
        Exists = 0;
      }
      else
      fclose(fp);
     
      return(Exists);
    }

    Merci pour celui ou celle qui souhaiterais m'aider.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 921
    Points : 4 718
    Points
    4 718

    Par défaut

    Citation Envoyé par domideba Voir le message
    Je souhaite recevoir du texte brut sans décodage "FF"
    Je ne comprends pas bien ta demande. Heureusement le code lui est plus clair. A aucun moment il ne modifie ce qu'il reçoit de la RS232 (il découpe la réception sur détection des retours chariots, et donc ne sait traiter que des données ASCII pas des octets bruts). Il transmet à l'identique ce qu'il a découpé à la fonction CreateRxDataFile() que tu n'as pas fourni.

    Il faudrait donc :
    - un exemple "précis" à minima de ce qui était émis à avant et ce qui était retourné.
    - Un exemple "précis" des nouvelles trames et de ce qui est attendu en sortie.
    - Et il faut le code de CreateRxDataFile().

    Ce que je crains c'est que les données transmises soient des octets bruts (on n'appelle pas cela de l'hexadécimal) et dans ce cas il faut le format exact pour gérer un séparateur ou une gestion de synchro. Sans cela, il n'y aurait aucune solution (c'est impossible d'extraire des données intelligibles d'un flux continu.)
    Si c'est du texte par contre, la solution serait très simple, du moins après avoir compris le problème

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    mai 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : mai 2015
    Messages : 30
    Points : 9
    Points
    9

    Par défaut

    Bonjour Dalfab,

    Merci pour t'intéresser à mon "cas".

    Je n'ai pas voulu trop compliquer ma question, je t'explique plus en détails.

    Je souhaite recevoir les données d'un lecteur RFID relié par RS232, et l'exploiter dans un tableur LibreOffice "Calc" au moyen d'une macro.

    La chaîne de caractères envoyée qui pose problème, est par exemple, pour mon premier "tag" : E2000019490F0214201048D3

    Cette chaîne de caractères n'est pas bien écrite dans le fichier temporaire " rxdata.txt " généré par le programme "C" dont nous parlons, et dont le contenu est récupéré par la macro.

    Je cherche donc, à pouvoir recevoir et écrire le fichier temporaire, au minimum avec les 8 derniers caractères de cette chaîne.

    Mais avec cette chaîne que je nomme Hexadécimale; je reçois juste 2 caractère bizarres (petit carré avec 01 et Y avec 2 points dessus ) qui s'écrivent dans le fichier "rxdata.txt"

    Lorsque je teste avec un GPS portable, relié par RS232, je reçois bien sa chaîne de caractères qui est du style @190509141552___________________

    Maintenant, dis-moi ce que tu veux que je publie pour faire avancer ton aide, car je ne trouve nulle-part la fonction "CreateRxDataFile()".



    Merci

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 921
    Points : 4 718
    Points
    4 718

    Par défaut

    désolé, je n'ai pas vu la fonction dans le code. Elle ne fait que mettre les données dans le fichier, donc pas elle le problème.
    Es-tu sûr qu'il y a une erreur dans le fichier généré? Je ne vois pas de problème dans le code qui transmet tel quel ce qu'il reçoit. Ça pourrait peut-être venir de la macro VBA.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    mai 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : mai 2015
    Messages : 30
    Points : 9
    Points
    9

    Par défaut

    Citation Envoyé par dalfab Voir le message
    désolé, je n'ai pas vu la fonction dans le code. Elle ne fait que mettre les données dans le fichier, donc pas elle le problème.
    Es-tu sûr qu'il y a une erreur dans le fichier généré? Je ne vois pas de problème dans le code qui transmet tel quel ce qu'il reçoit. Ça pourrait peut-être venir de la macro VBA.
    Salut Dalfab,

    Je vais refaire un test et prendre une copie d'écran avec les 2 dispositifs.
    Si tu le souhaite, je peux aussi prendre les 2 trames à l'oscillo, afin d'obtenir les caractères de contrôle éventuels.
    ( mais il me semble que la dernière fois où j'ai réalisé ce test, il n'y en avais pas )
    Je pense vraiment que certains codes Hexa "non imprimables, > asc (127) " arrivent dans le fichier temporaire et de ce fait, ne s'impriment pas.

    Je te fais ces copies d'écran ?

    A plus, et merci pour ton support, je suis occupé avec cela depuis pas mal de temps....

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    mai 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : mai 2015
    Messages : 30
    Points : 9
    Points
    9

    Par défaut

    Voici les photos des 2 captures GPS ( qui va bien ) et RFID ( +/- HEXA ) ainsi que la copie d'écran de ma feuille CALC de LibreOffice dans les 2 cas. Je m'arrache les cheveux Grrr

    Nom : Capture-GPS.png
Affichages : 107
Taille : 368,7 Ko
    Nom : Capture-RFID.png
Affichages : 114
Taille : 87,6 Ko
    Nom : Value RxData.txt-GPS.png
Affichages : 117
Taille : 96,0 Ko
    Nom : Value RxData.txt-RFID.png
Affichages : 112
Taille : 94,2 Ko

    Et c'est ce que je retrouve dans le fichier temporaire RxData.txt.

    Dis-moi ce que je dois encore envoyer comme photos, fichier..

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    10 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 10 604
    Points : 23 665
    Points
    23 665

    Par défaut

    E2000019490F0214201048D3 n'est pas une chaine de caractères. C'est du du code ASCII brut, tu ne peux pas utiliser les fonctions de la famille str avec. un strcpy par exemple va s'arrêter au second caractère (00)qui indique la fin d'une chaine.

    Il te faut lire tous les octets sur le port série et convertir les valeurs de façon en faire une représentation ASCII.
    Exemple le code ASCII 0xE2 deviendra la lettre E (0x45) puis le chiffre 2 (0x32) donc chaine ASCII 0x450x320x00 ( 0x00 pour fin de chaine) étant lu comme la chaine "E" par les fonctions de la famille str. A partir de là, tu pourras écrire les chaines dans un fichier.txt lisible par tout ce qui est capable de lire du texte.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    mai 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : mai 2015
    Messages : 30
    Points : 9
    Points
    9

    Par défaut

    Citation Envoyé par chrtophe Voir le message
    E2000019490F0214201048D3 n'est pas une chaine de caractères. C'est du du code ASCII brut, tu ne peux pas utiliser les fonctions de la famille str avec. un strcpy par exemple va s'arrêter au second caractère (00)qui indique la fin d'une chaine.

    Il te faut lire tous les octets sur le port série et convertir les valeurs de façon en faire une représentation ASCII.
    Exemple le code ASCII 0xE2 deviendra la lettre E (0x45) puis le chiffre 2 (0x32) donc chaine ASCII 0x450x320x00 ( 0x00 pour fin de chaine) étant lu comme la chaine "E" par les fonctions de la famille str. A partir de là, tu pourras écrire les chaines dans un fichier.txt lisible par tout ce qui est capable de lire du texte.


    Bonjour Chrtophe,

    Pourquoi alors cela fonctionne avec les chiffres ? ( désolé, je suis vraiement débutant en "C" )
    Il s'agit d'un code "C" que j'ai récupéré, et qui est libre d'utilisation.
    Et je ne vois vraiment pas comment le modifier pour faire ce que tu me conseille de faire.
    Aurais-tu un peu de temps pour me guider ?

    Merci pour ton attention.

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur
    Inscrit en
    août 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : août 2011
    Messages : 53
    Points : 137
    Points
    137

    Par défaut

    Bonjour j'ai suivi de loin la discussion je pense qu'il faut essayer de modifier la fonction CreateRxDataFile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    static void CreateRxDataFile(char *FileName, char *Data,int len)
    {
      FILE *f;
      int i,err;
     
      f = fopen(FileName, "w");
      if (f == NULL)
      {
          printf("Error opening file!\n");
          return;
      }
      /* print some text */
      for(i=0;i<len;i++)
     {
        err = fputc(Data[i],f);
        if(err == EOF)
        {
           printf("Error writing in file!\n");
           break;
        }
     }
      /* Do not forget to close the file */
      fclose(f);
    }
    et du coup tu appelle CreateRxDataFile comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateRxDataFile(RxDataFile, RxMsg,Idx);
    A voir si cela peut fonctionner

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 921
    Points : 4 718
    Points
    4 718

    Par défaut

    L'information qui manque est d'où sors-tu la séquence E2000019490F0214201048D3 ?
    Tu indiques que @190509141552___________________ est correctement géré. Il serait donc donc bien une séquence de caractères ASCII (ont été émis les caractères '@' puis '1' puis '9' puis '0' ...)
    Quant à E2000019490F0214201048D3 il semblerait que ce que tu affiches est une séquence d'octets pas une séquence ASCII (en gros ce qui est émis ça n'est pas le caractère 'E' puis le caractère '2' puis le caractère '0' puis ..., mais ça serait plutôt l'octet codé E2 puis l'octet codé 00 puis...).
    S'il faut une copie c'est de l'utilitaire qui affiche E2000019490F0214201048D3. Si c'est une séquence de caractères le soft devrait marcher, nous craignons donc que ça soit une séquence d'octets et là aïe!

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    mai 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : mai 2015
    Messages : 30
    Points : 9
    Points
    9

    Par défaut

    Citation Envoyé par pjlan Voir le message
    Bonjour Pjlan,

    Merci pour ton aide, hier j'étais en déplacement pour le boulot. J'essaye de modifier et compiler et te tiens informé.

    Encore merci.

    Citation Envoyé par dalfab Voir le message
    Bonjour Dalfab,

    Merci aussi pour ton suivi, comme indiqué dans mon premier message, les données E2000019490F0214201048D3 proviennent de mon lecteur de TAG Rfid, et cette valeur est la valeur inscrite dans le Tag. Chaque Tag possède une valeur différente, principalement sur les derniers caractères.


    J'ai un problème lors de la compilation, pouvez-vous voir ce qui cloche ?
    Est-ce que j'ai fait une erreur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    #include <stdio.h>
    #include <string.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <termios.h>
    #include <unistd.h>
    #include <sys/ioctl.h>
     
    #define RX_MSG_MAX_LEN       512
    #define RX_DATA_FILE_MAX_LEN 512
    #define RX_LOCK_FILE_MAX_LEN 512
     
    static void CreateRxDataFile(char *FileName, char *Data);
    static int  LockFileExists(char *FileName);
    static void CreateLockFile(char *FileName);
     
    int main(int argc,char** argv)
    {
      struct termios tio;
      struct termios stdio;
      struct termios old_stdio;
      int tty_fd, Idx = 0, Ret, ExitVal = 1;
      char RxMsg[RX_MSG_MAX_LEN + 1];
      char RxDataFile[RX_DATA_FILE_MAX_LEN + 1];
      char RxLockFile[RX_DATA_FILE_MAX_LEN + 1];
      unsigned char c = 'D';
     
      if(argc < 5)
      {
        printf("Please start with %s /dev/ttyS1 19200 rxdata.txt lock.txt (for example)\n", argv[0]);
      }
      else
      {
        strncpy(RxDataFile, argv[3], RX_DATA_FILE_MAX_LEN);
        printf("RxDataFile=%s\n", RxDataFile);
        strncpy(RxLockFile, argv[4], RX_LOCK_FILE_MAX_LEN);
        printf("RxLockFile=%s\n", RxLockFile);
        tcgetattr(STDOUT_FILENO, &old_stdio);
        memset(&stdio, 0, sizeof(stdio));
        stdio.c_iflag = 0;
        stdio.c_oflag = 0;
        stdio.c_cflag = 0;
        stdio.c_lflag = 0;
        stdio.c_cc[VMIN] = 1;
        stdio.c_cc[VTIME] = 0;
        tcsetattr(STDOUT_FILENO, TCSANOW, &stdio);
        tcsetattr(STDOUT_FILENO, TCSAFLUSH, &stdio);
        fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);       /* make the reads non-blocking */
     
        memset(&tio, 0, sizeof(tio));
        tio.c_iflag = 0;
        tio.c_oflag = 0;
        tio.c_cflag = CS8 | CREAD | CLOCAL;           /* 8n1, see termios.h for more information */
        tio.c_lflag = 0;
        tio.c_cc[VMIN] = 1;
        tio.c_cc[VTIME] = 5;
     
        tty_fd=open(argv[1], O_RDWR | O_NONBLOCK);
        if(!strcmp(argv[2], "115200"))
        {
          cfsetospeed(&tio, B115200);            /* 115200 baud */
          cfsetispeed(&tio, B115200);            /* 115200 baud */
        }
        else if(!strcmp(argv[2], "57600"))
        {
          cfsetospeed(&tio, B57600);            /* 57600 baud */
          cfsetispeed(&tio, B57600);            /* 57600 baud */
        }
        else if(!strcmp(argv[2], "38400"))
        {
          cfsetospeed(&tio, B38400);            /* 38400 baud */
          cfsetispeed(&tio, B38400);            /* 38400 baud */
        }
        else if(!strcmp(argv[2], "19200"))
        {
          cfsetospeed(&tio, B19200);            /* 19200 baud */
          cfsetispeed(&tio, B19200);            /* 19200 baud */
        }
        else if(!strcmp(argv[2], "9600"))
        {
          cfsetospeed(&tio, B9600);            /* 9600 baud */
          cfsetispeed(&tio, B9600);            /* 9600 baud */
        }
        else if(!strcmp(argv[2], "4800"))
        {
          cfsetospeed(&tio, B4800);            /* 4800 baud */
          cfsetispeed(&tio, B4800);            /* 4800 baud */
        }
        else if(!strcmp(argv[2], "2400"))
        {
          cfsetospeed(&tio, B2400);            /* 2400 baud */
          cfsetispeed(&tio, B2400);            /* 2400 baud */
        }
        else if(!strcmp(argv[2], "1200"))
        {
          cfsetospeed(&tio, B1200);            /* 1200 baud */
          cfsetispeed(&tio, B1200);            /* 1200 baud */
        }
        else
        {
          /* default is 115200 */
          cfsetospeed(&tio, B115200);            /* 115200 baud */
          cfsetispeed(&tio, B115200);            /* 115200 baud */
        }
        tcsetattr(tty_fd, TCSANOW, &tio);
        while (c != 'q')
        {
      /*	if (read(tty_fd,&c,1)>0)        write(STDOUT_FILENO,&c,1);  if new data is available on the serial port, print it out */
          Ret = 0;
          if (read(tty_fd, &c, 1) > 0)
          {
    	if( ((c == 10) && Idx) || ((c == 13) && Idx) || (Idx >= RX_MSG_MAX_LEN))
    	{
    	  RxMsg[Idx] = 0;
    	  Idx = 0;
    	  Ret = 1;
    	}
    	else
    	{
    	  if((c != 10) && (c != 13))
    	  {
    	    RxMsg[Idx] = c;
    	    Idx++;
    	  }
    	}
          }
          if(Ret)
          {
    	Ret = 0;
    	printf("Rx: '%s'\n\r", RxMsg);
            while(LockFileExists(RxLockFile))
    	{
    	  usleep(5);/* Wait until calc reads the data.txt file and removes the lock.txt file. */
    #if 1
    	  if(read(STDIN_FILENO, &c, 1) > 0) /* Allow to quit with q in the console */
    	  {
    	    if(c == '&') break;
    	  }
    #endif
    	}
    	CreateRxDataFile(RxDataFile, RxMsg, Idx);
            CreateLockFile(RxLockFile);
          }
          usleep(5);
          if (read(STDIN_FILENO, &c, 1) > 0) Ret = write(tty_fd,&c,1);        /* if new data is available on the console, send it to the serial port */
        }
        close(tty_fd);
        tcsetattr(STDOUT_FILENO, TCSANOW, &old_stdio);
        ExitVal = 0;
      }
      return ExitVal;/* EXIT_SUCCESS; */
    }
     
    static void CreateRxDataFile(char *FileName, char *Data)
    {
      FILE *f;
      int i,err;
     
      f = fopen(FileName, "w");
      if (f == NULL)
      {
          printf("Error opening file!\n");
          return;
      }
      /* print some text */
      for(i=0;i<len;i++)
     {
        err = fputc(Data[i],f);
        if(err == EOF)
        {
           printf("Error writing in file!\n");
           break;
        }
     }
      /* Do not forget to close the file */
      fclose(f);
    }
     
    static void CreateLockFile(char *FileName)
    {
      FILE *f;
     
      f = fopen(FileName, "w");
      if (f == NULL)
      {
          printf("Error opening lock file!\n");
          return;
      }
      /* print some text */
      fprintf(f, "%s\n", "DataAvailable");
      /* Do not forget to clode the file */
      fclose(f);
    }
     
    static int LockFileExists(char *FileName)
    {
      FILE *fp;
      int Exists = 1;
     
      fp = fopen(FileName, "r");
      if (fp == NULL) {
        Exists = 0;
      }
      else
      fclose(fp);
     
      return(Exists);
    }
    et j'obtiens cette erreur ( screen copy )
    Nom : erreur compil.png
Affichages : 86
Taille : 51,9 Ko

    Voilà, j'espère que ce sera clair pour toi, car moi je n'ai pas encore assez de connaissances en "C"

  12. #12
    Membre habitué
    Homme Profil pro
    Développeur
    Inscrit en
    août 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : août 2011
    Messages : 53
    Points : 137
    Points
    137

    Par défaut

    Ligne 13 : static void CreateRxDataFile(char *FileName, char *Data,int len);
    Ligne 154 : static void CreateRxDataFile(char *FileName, char *Data,int len)

    Ceci dit avec les remarques qu'ont fait les autres je doute assez fortement que ça résolve ton problème initial.

  13. #13
    Candidat au Club
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    mai 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : mai 2019
    Messages : 2
    Points : 2
    Points
    2

    Par défaut

    Citation Envoyé par dalfab Voir le message
    L'information qui manque est d'où sors-tu la séquence E2000019490F0214201048D3 ?
    Tu indiques que @190509141552___________________ est correctement géré. Il serait donc donc bien une séquence de caractères ASCII (ont été émis les caractères '@' puis '1' puis '9' puis '0' ...)
    Quant à E2000019490F0214201048D3 il semblerait que ce que tu affiches est une séquence d'octets pas une séquence ASCII (en gros ce qui est émis ça n'est pas le caractère 'E' puis le caractère '2' puis le caractère '0' puis ..., mais ça serait plutôt l'octet codé E2 puis l'octet codé 00 puis...).
    S'il faut une copie c'est de l'utilitaire qui affiche E2000019490F0214201048D3. Si c'est une séquence de caractères le soft devrait marcher, nous craignons donc que ça soit une séquence d'octets et là aïe!
    Même si c'est une séquence d'octet, je ne vois pas le problème.
    Il faut simplement récupérer l'info à la source et la mettre sous format ASCII.
    C'est une conversion HEX -> ASCII.
    Je l'ai déjà fait pour un GPS. Je vais essayer de retrouver le code.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    mai 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : mai 2015
    Messages : 30
    Points : 9
    Points
    9

    Par défaut

    Citation Envoyé par pjlan Voir le message
    Ligne 13 : static void CreateRxDataFile(char *FileName, char *Data,int len);
    Ligne 154 : static void CreateRxDataFile(char *FileName, char *Data,int len)

    Ceci dit avec les remarques qu'ont fait les autres je doute assez fortement que ça résolve ton problème initial.


    Merci Pjlan, plus de problème de compilation, mais je n'arrive toujours pas à obtenir la lecture correcte.

    Citation Envoyé par jonathanRJ45 Voir le message
    Même si c'est une séquence d'octet, je ne vois pas le problème.
    Il faut simplement récupérer l'info à la source et la mettre sous format ASCII.
    C'est une conversion HEX -> ASCII.
    Je l'ai déjà fait pour un GPS. Je vais essayer de retrouver le code.

    Merci pour ton aide Jonathan.

  15. #15
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 921
    Points : 4 718
    Points
    4 718

    Par défaut

    Bonjour,
    On est donc dans le cas que je craignais de d'émission d'octets bruts.

    Des conversions octets vers ASCII j'en fait très souvent. Mais ici avant d'appeler la fonction on doit détecter le début et la de la trame. Ici le code suppose qu'une trame se termine par un Carriage return ou par un line feed. C'est la ligne 120 : if((c != 10) && (c != 13))Cette ligne n'a aucun sens sur un buffer binaire, il manque le critère de fin et ce traitement est a faire avant l'appel à CreateRxDataFile().
    Je peux fournir le code de transformation mais ça ne peut pas marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    static void CreateRxDataFile(char *FileName, char *Data, int len )
    {
      FILE *f;
      int i, err;
     
      f = fopen(FileName, "w");
      if ( f == NULL )
      {
          printf("Error opening file!\n");
          return;
      }
      /* print some text */
      for(i=0;i<len;i++)
      {
        /* debut conversion binaire vers ASCII*/
        static const char Conv[] = "0123456789ABCDEF";
        fputc( Conv[ ((unsigned char*)Data)[i]>>4 ] , f );
        err = fputc( Conv[ Data[i]&0xF ] , f );
        /* fin zone de conversion binaire vers ASCII*/
        if(err == EOF)
        {
           printf("Error writing in file!\n");
           break;
        }
     }
      /* Do not forget to close the file */
      fclose(f);
    }
    Mais tu devrais recevoir les caractères affichables (mais mal découpés!)

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    mai 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : mai 2015
    Messages : 30
    Points : 9
    Points
    9

    Par défaut

    Bonjour Dalfab,

    Merci pour cet exemple, mais malheureusement, cela ne fonctionne pas.
    Je retrouve aussi les 3 fichiers temporaires.txt qui ne s’effacent pas. (RxData.txt; Lock.txt et un autre dont j'oublie le nom )
    A l'intérieur de ces fichiers, je retrouve 2 caractères étrange comme avant, dans un autre "Data" et dans l'autre, je ne sais plus, mais rien à voir avec la partie de la chaine de caractères )

    Je pense que l'on est près du but, cela doit-être une connerie, mais il faut trouver où cela coince.

    Merci pour ton aide.

  17. #17
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 921
    Points : 4 718
    Points
    4 718

    Par défaut

    Les noms des fichiers sont passés en paramètres lors de l'appel de l'application. Il ne devrait y avoir que 2 fichiers. Dans le fichier de lock est écrit un texte qui ne sert à rien c'est "DataAvailable". Si ce fichier existe au démarrage le système se bloque et ne produit plus rien. Alors commencer par supprimer ces fichiers et relancer l'application.
    Je ne suis pas aussi sûr d'être près du but. On ne sait toujours pas découper la chaîne initiale...

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    mai 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : mai 2015
    Messages : 30
    Points : 9
    Points
    9

    Par défaut

    Bonjour les gars,

    Je viens de prendre à l'oscillo, la lecture et le décodage de 2 tags différents, j'espère que cela va aider dans les investigations pour l'envoi de ces données vers le PC.

    Pour le tag n°2 ( n°2 pour mes essais ), je lis et capte :

    <CC><FF><FF><10><32><0D><01><E2><00><00><19><49><0F><02><14><20><10><48><D3><32>

    Nom : SDS00001.png
Affichages : 48
Taille : 17,4 Ko

    Il s'agit de la chaîne "E2000019490F0214201048D3" comme indiqué dans mes messages précédents, mais avec semble-t-il, des caractères ajoutés par le lecteur RFID ?


    Pour le tag n°3 ( n°3 pour mes essais ), je lis et capte :

    <CC><FF><FF><10><32><0D><01><E2><00><00><19><49><0F><02><14><21><00><3E><88><96>

    Nom : SDS00002.png
Affichages : 48
Taille : 17,7 Ko

    Il me semble qu'il s'agit bien d'une trame complète hexadécimale. ( je me trompe ? )


    Si je pouvais récupérer les 4 ou 5 derniers Bytes, je serais heureux, car mon système fonctionnerais.

    Merci d'avance, pour votre aide.

  19. #19
    Candidat au Club
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    mai 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : mai 2019
    Messages : 2
    Points : 2
    Points
    2

    Par défaut

    C'est plutôt positif, tes 2 trames font 20 octets chacune. Ce qui facilitera la mise en place d'un masque.

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    mai 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : mai 2015
    Messages : 30
    Points : 9
    Points
    9

    Par défaut

    Plus personne pour m'aider ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/04/2016, 11h56
  2. Réponses: 1
    Dernier message: 22/07/2009, 17h47
  3. Réponses: 1
    Dernier message: 10/04/2007, 23h29
  4. zone de liste modifiable vers sous formulaire
    Par Oliviers dans le forum IHM
    Réponses: 11
    Dernier message: 07/01/2007, 16h16
  5. Liste modifiable vers champ texte ou mémo
    Par Michel DEMANET dans le forum Access
    Réponses: 14
    Dernier message: 21/01/2006, 09h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo