IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

 Delphi Discussion :

Fichier string, Port com et donnée


Sujet :

Delphi

  1. #1
    Membre du Club

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut Fichier string, Port com et donnée
    Bonjour a tous,

    Voila mon probleme :

    J'ai un fichier texte (*.txt) qui a la struture suivante :
    00001111
    11110000 (example)

    Bref, une suite de chiffre binaire sous forme d'octet.

    Je cherche a envoyer ces octets sur le port Com (composant TComPort), mais j'hésite sur la méthode a employer. En fait comment code windows, est-ce en ASCII, ou je doit coder les octets sous forme hexa ?

    Je precise que la réception des octets est décode par un microprocesseur.

    Un dernier details, TComPort transmet des données sous forme de string.


    Merci pour votre aide

    cordialement,

    elecpic

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Personnellement, j'utilisais la librairie CPort (pour la vitesse de réactivité) ou AsyncFree (pour la simplicité d'utilisation, hélas peu réactive si l'on est sur un protocole série rapide).

    Aucune des deux n'impose l'envoi de chaînes exclusivement, même si elles le supportent bien entendu. L'utilisation de buffers d'octets reste la méthode primaire d'envoi.

    Dans ton cas, ton fichier contient sur chaque ligne un octet encodé en binaire : il te suffit de lire les 8 bits correspondants, puis de le traduire en un Byte utilisable par les librairies de gestion du port série.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre du Club

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut si j'ai tout compris ...
    bonjour Mac Lak,

    Bon, si j'ai tout bien compris, j'envoie l'octet au format texte sur le port,
    et je recupere les bits sur ma platine electronique. J'ai donc pas besoin de traduire les octets.

    Si je me trompe, merci de me le signaler.

    Merci de ta reponse et te souhaite une bonne fin de journée.

    cordialement,

    elecpic

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par elecpic Voir le message
    Bon, si j'ai tout bien compris, j'envoie l'octet au format texte sur le port,
    et je recupere les bits sur ma platine electronique. J'ai donc pas besoin de traduire les octets.
    Hein ?? Si, faut les traduire en Delphi depuis le fichier texte !!

    Si tu envoie la chaîne "01101001" sur le port série, ton contrôleur va péter une durite, car tu vas en réalité lui envoyer HUIT octets valant soit 48, soit 49 !

    Tu lis la chaîne (8 caractères) depuis le fichier, tu la convertis de sa représentation texte binaire vers un format numérique interne (un Byte, donc), puis tu envoie UN Byte par le port série.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre du Club

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut
    Donc, si je te suis, si j'envoie un '0 ou un '1', le pc envoie le code ascii corespondant (soit 1 byte).

    POur envoyer un octet binaire (ex :0000 1111), je doit faire corespondre les bytes 1 par 1:

    soit sur 1 byte (je reprend mon example):

    0+65 = 65 = A
    0+65 = 65 = A
    0+65 = 65 = A
    0+65 = 65 = A
    1+65 = 66 = B
    1+65 = 66 = B
    1+65 = 66 = B
    1+65 = 66 = B

    j'envoie donc 8 bytes qui corespondent apres decodage par le microprocesseur à mes 8 bits.

    Ca me parait un peu long pour atteindre des bonnes vitesses ...

    j'ai peut etre raté un train

    ai'je bien tout compris ?

    cordialement

    elecpic

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut


    Non, "00001111" vaut 15 en décimal, c'est ce "15" stocké dans un Byte que tu envoie au µC... Si t'essaie de programmer un µC sans connaître la base de l'encodage binaire, t'es pas rendu, tu sais ?

    Il te faut une fonction de ce genre :
    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
    Function BinToDec ( BinString : String) : Byte ;
    Begin
         If Length(BinString)<>8 Then
            Raise Exception.Create("Invalid binary string") ;
         Result:=0 ;
         For I:=1 To 8 Do
             Begin
             // Identification du chiffre : 0, 1 ou erreur.
             Case BinString[I] Of
                  Case '0' : V:=0 ;
                  Case '1' : V:=1 ;
                  Else Raise Exception.Create("Invalid binary digit") ;
             End ;
             // Ajout du chiffre binaire, par décalage et ajouts successifs.
             Result := (Result Shl 1) + V ;
             End;
         // Retour du résultat.
    End;
    Pas testée, mais le principe est là.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Membre du Club

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut
    Merci Mac Lak,

    Je viens de capter. Enfait il suffit de 'crypter' la chaine string en valeur decimale (0 a 255) et de l'envoyer sur le port. Apres, et fort logiquement cette valeur sera transmise sous forme de bits (1 byte) au µC.

    Je tient a te remercier tres chaleureusement car tu viens de me donner la clé de 30 ans de recherche. Mon reve a toujours été de pouvoir piloter de l'éléctronique par un PC (le tout fait maison).

    Un reve de gosse bientot réalisé

    merci encore mille fois

    elecpic

    Ps : Mon principe : La vie est une dure lut'

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par elecpic Voir le message
    Je viens de capter. Enfait il suffit de 'crypter' la chaine string en valeur decimale (0 a 255) et de l'envoyer sur le port. Apres, et fort logiquement cette valeur sera transmise sous forme de bits (1 byte) au µC.
    C'est exactement ça. Bon, tu vois, ça finit par venir !
    Plus sérieusement, il te faudra faire plusieurs petites fonctions dans ce genre, et les mettre dans une belle unité Delphi afin de toujours les avoir sous la main.
    Notamment, certains µC peuvent demander les bits au format LSB (Less Significant Bit, le bit de poids faible en premier) ou MSB (Most Significant Bit, le bit de poids fort en premier), ou les demander par paquets de 16, ou par quartets (nibbles, 4 bits), que sais-je encore...

    Quand tu auras besoin d'une telle fonction, écris-la, fais-le ultra proprement (gestion d'erreurs et tout et tout), puis mets-la en librairie. Tu t'en resservira certainement, donc autant capitaliser le code qui marche.

    Citation Envoyé par elecpic Voir le message
    Je tient a te remercier tres chaleureusement car tu viens de me donner la clé de 30 ans de recherche. Mon reve a toujours été de pouvoir piloter de l'éléctronique par un PC (le tout fait maison).
    Y'a plein de choses pour jouer à la maison avec ce genre de trucs, les plus connus étant bien sûr les PIC... Mais il y en a pas mal d'autres, en électronique plus ou moins élaborée.

    Citation Envoyé par elecpic Voir le message
    Un reve de gosse bientot réalisé
    Content pour toi ! Va aussi voir sur ce sujet au cas où, car le port parallèle est également un grand classique de l'électronique "maison".

    Par exemple, parmi les "grands classiques", c'est d'utiliser le port parallèle (8 voies, donc) afin d'avoir 8 lignes parallèles d'alimentation à étages : le premier étage consiste juste en la commande d'un transistor, qui lui-même alimente un relais un peu plus gros, qui enfin déclenche un relais 220V pour allumer un appareil quelconque. Avec les bonnes protections par optocoupleurs / pullups / pulldonws, tu peux faire un petit bricolage maison bien sympathique pour allumer / éteindre des éléments extérieurs au PC depuis le bureau, ou en démarrage / extinction du PC...

    Tu peux également faire du bourrin de base : le port parallèle pour sélectionner le circuit à utiliser, puis le port série pour le commander (éventuellement via des registres à décalage pour repasser en parallèle). Les lignes CTS/RTS du port série peuvent également servir à ça, pour valider par exemple un octet envoyé.

    Bref, t'as de quoi faire si tu n'as pas le fer à souder en ennemi personnel, et une fois les bases de communication réalisées (ports série et parallèle), tu n'as plus qu'à jouer tranquille !

    Pense au aussi, merci !
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #9
    Membre du Club

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut
    Un re tres grand merci

    Bon, avant de suivre ton conseil, je termine le programme sous delphi (et y a du boulot ) afin me poursuivre ce reve.

    Bien entendu, cela étant fini, je me mets sous le coude ce morceau de code avec bien entendu tout ce qui vas avec.

    Encore une fois, un tres grand merci, tant pour tes conseils, ta patience et ta gentillesse.

    elecpic

    ps : je balise resolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD12E] données port com vers fichier txt
    Par ryaxx dans le forum WinDev
    Réponses: 18
    Dernier message: 10/03/2010, 11h15
  2. Port COM -> Envoie données Hexadecimale
    Par benda95280 dans le forum Langage
    Réponses: 9
    Dernier message: 21/01/2010, 12h19
  3. Réponses: 1
    Dernier message: 19/12/2006, 11h18
  4. erreur fichier ports COM
    Par _yeye_ dans le forum Visual C++
    Réponses: 3
    Dernier message: 27/09/2006, 08h16
  5. [socket] envoyer des données vers un port com
    Par Slimer dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 20/07/2004, 17h35

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