Port série Arduino
Répondre à la discussion
Affichage des résultats 1 à 19 sur 19

Port série Arduino



  1. #1
    Loptr

    Port série Arduino


    ------

    Bonjour je suis en train de faire un projet arduino, et j'ai rencontré un problème :
    J'ai créé une variable message qui stock les messages reçu sur le port série et sur ce même port série je reçois deux types d'information, des lettres et des chiffres et je voudrais que les chiffres aillent dans une variable (comme nombre par exemple) et que les lettres aillent dans un autre variable (par exemple dans message), en fait je voudrais trier les informations que je reçois dans 2 variables différentes.
    Est-ce que c'est possible ? Si oui, quelqu'un peut m'expliquer comment faire svp ?
    Merci.

    -----

  2. #2
    jiherve

    Re : Port série Arduino

    Bonsoir
    Ben oui c'est possible, se procurer un tableau donnant la correspondance ASCII caractère .
    Les chiffres sont entre 0x30 et 0x39 les lettres commencent à 0x41 jusqu’à 0x5A en majuscules
    https://fr.wikipedia.org/wiki/Americ...k_ref_card.jpg
    il faudra rajouter un peu de code en aval de la réception, trivial!!
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    cherbe

    Re : Port série Arduino

    Citation Envoyé par jiherve Voir le message
    Ben oui c'est possible, se procurer un tableau donnant la correspondance ASCII caractère ............
    Heu,il y a plus simple quand même.
    Un exemple peut-être pas très orthodoxe mais efficace consiste à additionner (ou soustraire) 1 à chaque valeur et analyser l'opération. Si erreur, ce sont des lettres ; sinon devine quoi !
    Il y a aussi les expressions régulières qui font ça en une ligne de code mais c'est pas mon fort et ça dépend du langage.
    Dernière modification par cherbe ; 15/12/2016 à 03h52.
    Pour avoir de l'argent devant soi, il faut en mettre de côté ! (proverbe lorrain)

  4. #4
    polo974

    Re : Port série Arduino

    Citation Envoyé par cherbe Voir le message
    Heu,il y a plus simple quand même.
    Un exemple peut-être pas très orthodoxe mais efficace consiste à additionner (ou soustraire) 1 à chaque valeur et analyser l'opération. Si erreur, ce sont des lettres ; sinon devine quoi !
    Il y a aussi les expressions régulières qui font ça en une ligne de code mais c'est pas mon fort et ça dépend du langage.
    heuu, là, c'est de l'arduino, du 8 bit, plus proche de l'assembleur que du python.

    tes 2 solutions apparemment simples masquent un traitement bien compliqué, comparé à la comparaison à 2 valeurs:
    Code:
    if (c >= '0' && c <= '9')
       rangenum(c);
    else
       rangetxt(c);
    Jusqu'ici tout va bien...

  5. A voir en vidéo sur Futura
  6. #5
    satinas

    Re : Port série Arduino

    Bonjour, Arduino c'est comme le Port-Salut ...

    // WCharacter.h prototypes
    inline boolean isAlphaNumeric(int c) __attribute__((always_inline)) ;
    inline boolean isAlpha(int c) __attribute__((always_inline)) ;
    inline boolean isAscii(int c) __attribute__((always_inline)) ;
    inline boolean isWhitespace(int c) __attribute__((always_inline)) ;
    inline boolean isControl(int c) __attribute__((always_inline)) ;
    inline boolean isDigit(int c) __attribute__((always_inline)) ;
    inline boolean isGraph(int c) __attribute__((always_inline)) ;
    inline boolean isLowerCase(int c) __attribute__((always_inline)) ;
    inline boolean isPrintable(int c) __attribute__((always_inline)) ;
    inline boolean isPunct(int c) __attribute__((always_inline)) ;
    inline boolean isSpace(int c) __attribute__((always_inline)) ;
    inline boolean isUpperCase(int c) __attribute__((always_inline)) ;
    inline boolean isHexadecimalDigit(int c) __attribute__((always_inline)) ;
    inline int toAscii(int c) __attribute__((always_inline)) ;
    inline int toLowerCase(int c) __attribute__((always_inline)) ;
    inline int toUpperCase(int c)__attribute__((always_inline ));

  7. #6
    Ludwig1

    Re : Port série Arduino

    Salut,
    Citation Envoyé par Loptr Voir le message
    Bonjour je suis en train de faire un projet arduino, et j'ai rencontré un problème :
    J'ai créé une variable message qui stock les messages reçu sur le port série et sur ce même port série je reçois deux types d'information, des lettres et des chiffres et je voudrais que les chiffres aillent dans une variable (comme nombre par exemple) et que les lettres aillent dans un autre variable (par exemple dans message), en fait je voudrais trier les informations que je reçois dans 2 variables différentes.
    Est-ce que c'est possible ? Si oui, quelqu'un peut m'expliquer comment faire svp ?
    Merci.
    Dans la mesure ou tu expédies de l'ASCII, il suffit de regarder que l'octet soit compris entre 00011110 et 00100111

    BIN ______DECIMAL
    00011110 = 0
    00011111 = 1
    00100000 = 2
    00100001 = 3
    00100010 = 4
    00100011 = 5
    00100100 = 6
    00100101 = 7
    00100110 = 8
    00100111 = 9

    Si c'est le cas tu ranges dans Variable 1
    Si non tu ranges dans variable 2

    Si tu veux récupérer la valeur décimale correspondante à un chiffre, tu retires 00011110

    EX: 00100001 - 00011110 = 11 Binaire = 3 décimal

    Cordialement

    Ludwig

  8. #7
    Ikhar84
    Animateur Informatique

    Re : Port série Arduino

    Attention!
    Il faut faire le distingo entre le caractère qui représente un chiffre...
    Exemple le caractère '1'... qui a pour valeur décimale 49 (ASCII)...
    Et le chiffre 1... qui a pour valeur... 1

    Techniquement, tous les caractères ont une valeur décimale (ou binaire...)

    Lorsque vous parlez de chiffres, vous entendez parler de valeurs, ou de caractères représentant des chiffres (ou plutôt de la valeur de ce caractère suivant le codage).

    Autrement dit... lorsque vous attendez '1', recevez vous 1 ou 49 ?

  9. #8
    Ludwig1

    Re : Port série Arduino

    Salut,
    Citation Envoyé par Ikhar84 Voir le message
    Attention!
    Il faut faire le distingo entre le caractère qui représente un chiffre...
    Exemple le caractère '1'... qui a pour valeur décimale 49 (ASCII)...
    Et le chiffre 1... qui a pour valeur... 1

    Techniquement, tous les caractères ont une valeur décimale (ou binaire...)

    Lorsque vous parlez de chiffres, vous entendez parler de valeurs, ou de caractères représentant des chiffres (ou plutôt de la valeur de ce caractère suivant le codage).

    Autrement dit... lorsque vous attendez '1', recevez vous 1 ou 49 ?
    Je ne comprend pas très bien, il me semble que le code ASCII pour le
    Zéro c'est 30 puis 31 = 1 ... et 39 = 9.

    Cordialement
    Ludwig

  10. #9
    Jack
    Modérateur

    Re : Port série Arduino

    Citation Envoyé par Ludwig1 Voir le message
    Salut,


    Je ne comprend pas très bien, il me semble que le code ASCII pour le
    Zéro c'est 30 puis 31 = 1 ... et 39 = 9.

    Cordialement
    Ludwig
    Oui, mais tu parles en hexadécimal alors que Ikhar84 parle en décimal. Donc tout s'explique.

  11. #10
    Ikhar84
    Animateur Informatique

    Re : Port série Arduino

    Bien sûr, j'ai préféré démontré en décimal pour simplifier...
    Le signal est transmis en binaire et, pour des raison de commodité, on le transcrit en hexa lorsqu'on le traite octet par octet: de 00 à FF (ou de 0 à 255, ou de 0000 0000 à 1111 1111), tout simplement parceque l'écriture hexa est plus condensé...
    Mais une valeur reste une valeur, quelque soit la base utilisée, et pour mon exemple simpliste, la base décimale suffisait amplement pour faire passer mon message !
    A noter que lorsque l'on utilise une autre base, on le montre grâce à un préfixe (ou suffixe suivant le cas): 0x... pour l'hexa;
    0.... pour l'octal;
    0b...

    Mais je pensais ceci acquis.

  12. #11
    Loptr

    Re : Port série Arduino

    Merci à tous pour votre aide mais je ne comprend pas comment faire avec la technique de polo974, quand j'ai rangenum(c) et rangetxt(c) je fait comment pour les utiliser ? ex: if(rangenum(c)=='1'){
    ou
    if(rangetext(c)=='a'){
    C'est comme ça ?

  13. #12
    jiherve

    Re : Port série Arduino

    Bonsoir
    Citation Envoyé par cherbe Voir le message
    Heu,il y a plus simple quand même.
    Un exemple peut-être pas très orthodoxe mais efficace consiste à additionner (ou soustraire) 1 à chaque valeur et analyser l'opération. Si erreur, ce sont des lettres ; sinon devine quoi !
    Il y a aussi les expressions régulières qui font ça en une ligne de code mais c'est pas mon fort et ça dépend du langage.
    Quelle est la représentation d'une lettre en binaire ?
    un petit schéma logique du soustracteur lettre chiffre?
    n'importe quoi!
    Vu la demande originelle ma première reponse reste pertinente car lettres + chiffres => ASCII à moins d'inventer autre chose.
    JR
    Dernière modification par jiherve ; 16/12/2016 à 21h06.
    l'électronique c'est pas du vaudou!

  14. #13
    cherbe

    Re : Port série Arduino

    Citation Envoyé par jiherve Voir le message
    n'importe quoi!
    CHARTE :
    2. La courtoisie est de rigueur sur ce forum
    Pour avoir de l'argent devant soi, il faut en mettre de côté ! (proverbe lorrain)

  15. #14
    JPL
    Responsable des forums

    Re : Port série Arduino

    Là tu es bien susceptible.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  16. #15
    cherbe

    Re : Port série Arduino

    Citation Envoyé par JPL Voir le message
    Là tu es bien susceptible.
    Les mots/expressions ont un sens. Dire que celui-ci est discourtois est pour moi un euphémisme !
    Pour avoir de l'argent devant soi, il faut en mettre de côté ! (proverbe lorrain)

  17. #16
    JPL
    Responsable des forums

    Re : Port série Arduino

    La critique portait sur une idée (ou une suggestion) pas sur une personne. Disons que c'était sans nuance donc un peu rude. En tout cas rien qui puisse m'amener à intervenir comme modérateur.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  18. #17
    cherbe

    Re : Port série Arduino

    Je ne connais rien aux cartes Arduino mais la question portant exclusivement sur un problème de programmation que je connais un peu, je me suis permis d'intervenir en pensant qu'il s'agissait d'un langage "normal" dans lesquels ma suggestion fonctionne (en programmation, je ne suis pas le seul à provoquer sciemment des erreurs pour exploiter leur message).
    Mon erreur est de pas m'être tapé 7 fois la doc Arduino avant de répondre donc mea culpa !
    Pour avoir de l'argent devant soi, il faut en mettre de côté ! (proverbe lorrain)

  19. #18
    Ludwig1

    Re : Port série Arduino

    Salut,
    Citation Envoyé par Loptr Voir le message
    Merci à tous pour votre aide mais je ne comprend pas comment faire avec la technique de polo974, quand j'ai rangenum(c) et rangetxt(c) je fait comment pour les utiliser ? ex: if(rangenum(c)=='1'){
    ou
    if(rangetext(c)=='a'){
    C'est comme ça ?
    Essaye d'expliquer un peu plus ce que tu veux faire avec ta liaison série. En général on installe un petit multitâche (Round Robin) qui vient voir régulièrement la liaison série et range la valeur reçue, dans ton cas un chiffre dans un buffer chiffre ou un caractère dans un buffer chaine de caractères. Comme il faut shiffter les buffers (Last in Last out) il faut écrire une routine. Puis évidement il faut faire une analyse des données reçues. Ne pas oublier les marqueurs début et de fin de message.
    Je ne connais pas ton niveau (Programmation). Une autre façon de faire consiste à passer par les interrupts, c.a.d. chaque fois qu'une donnée est arrivée sur le port série, il y a déclanchement d'une interruption qu'il faudra traiter.
    Comme dit, je ne sais pas du tous ce que tu veux faire avec ta liaison série. Ce que je viens de dire est donc basé sur des suppositions.
    Cherche sur le FORUM, tu trouveras des infos sur les arduinos en mode multitâche. ( En supposant que les messages n'ont pas été supprimés).

    Cordialement
    Ludwig
    Dernière modification par Ludwig1 ; 17/12/2016 à 00h24.

  20. #19
    polo974

    Re : Port série Arduino

    Citation Envoyé par Loptr Voir le message
    Merci à tous pour votre aide mais je ne comprend pas comment faire avec la technique de polo974, quand j'ai rangenum(c) et rangetxt(c) je fait comment pour les utiliser ? ex: if(rangenum(c)=='1'){
    ou
    if(rangetext(c)=='a'){
    C'est comme ça ?
    Heuuu, pourquoi tu compliques tout ? ? ?
    Ma première ligne avec le if fait la différence entre les num et les autres caractères.

    les fonctions (fictives) rangenum et rangetext, c'était pour simplifier l'exemple. à toi de les écrire (ou de les remlacer par quelques lignes de code).
    Jusqu'ici tout va bien...

Discussions similaires

  1. Alimentation Arduino + port série
    Par pouic92 dans le forum Électronique
    Réponses: 9
    Dernier message: 06/01/2015, 23h08
  2. Arduino et port serie
    Par Sgroink dans le forum Internet - Réseau - Sécurité générale
    Réponses: 2
    Dernier message: 11/01/2014, 12h14
  3. Relier un interrupteur sur port parallèle (ou port série)
    Par invitedc8ebe95 dans le forum Électronique
    Réponses: 11
    Dernier message: 04/02/2013, 09h20
  4. Port parallèle vers port série
    Par invite5d1bc976 dans le forum Électronique
    Réponses: 7
    Dernier message: 12/07/2012, 14h10
  5. convertiseur port RS485/port serie
    Par invitedae5fd2a dans le forum Électronique
    Réponses: 0
    Dernier message: 17/01/2010, 13h47