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

API, COM et SDKs Delphi Discussion :

[Tportcom] Lire et écrire en asynchrone sur port RS232 d'un lecteur Phoenix


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 2
    Par défaut [Tportcom] Lire et écrire en asynchrone sur port RS232 d'un lecteur Phoenix
    Bonjour à tous.

    Je souhaiterais lire et écrire sur le port rs232 d'un lecteur de carte phoenix en mode asynchrone.

    Pour la partie lecture, j'ai réussi grace à un post de shinning, merci à lui.

    Voici d'ailleur le code :

    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
    function IGetBuffer(Count : Integer):String;
        var
        Buffer : array[0..255] of byte;
        I : Integer;
        S : String;
        begin
          Form1.ComPort1.Read(Buffer, Count);
          S:= '';
          for I := 0 to Count - 1 do
          //Inversion binaire avec NOT puis Swap pour asynchrone
          S := S + IntToHex(ReverseByte(NOT Buffer[I]),2)+ ' ';
          result := TrimRight(S);
        end;
     
    function ReverseByte(const X : byte) : byte ;
        const A : array [$0..$F] of byte =
          ($0,$8,$4,$C,$2,$A,$6,$E,$1,$9,$5,$D,$3,$B,$7,$F) ;
        begin
          ReverseByte := (A[X and $0F] shl 4) or (A[X shr 4])
        end ;
    Par contre pour l'écriture, je ne m'en sors pas.
    J'arrive à écrire quelque chose mais la valeur en retour n'est pas bonne.

    Voici le code

    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
    function WriteBuffer(Buffer : string): Boolean; 
    // Données hexa exemple 'de0002ca00'
      var
      B : Byte;
      CmdLen : byte;
      i : integer;
     
      begin
        CmdLen := Length(Buffer);
        i:=1;
        while i < CmdLen do
        begin
          B := strtoint('$'+(Buffer[i])+(Buffer[i+1]));
          Form1.ComPort1.Write(B, 1);
          Form1.ComPort1.Read (B, 1);
          i := i+2;
          Sleep(50);
        end;
        Sleep(250);
    end;
    Dois-je aussi swaper et inverser les bytes en écriture?

    Je vous remercie d'avance pour votre aide.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Par défaut
    Très longtemps que je n'ai pas utilisé le TComPort mais j'ai beaucoup travaillé avec il y a 2 ans pour la com avec une rs232 aussi.

    A priori, tu ne peux pas faire un Write et espérer qu'un Read juste après te donne le Byte que tu as écrit ou la réponse de ton matériel, spécialement en liaison asynchrone !!. Pour savoir quand ton byte (ou tes bytes) sera réellement transmis tu dois te baser sur le OnTxEmpty

    Pour moi, le mieux en réception c'est l'utilisation de TComDataPacket
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      FComData.ComPort:= FComPort;
      FComData.StartString:= '~'#0;
    //  FComData.StartString:= '~';
      FComData.StopString:= '~';
      FComData.OnPacket:= ComPacketReceiveData;
      FComData.OnDiscard:= ComPacketDiscardData;
      FComData.IncludeStrings:= true;
    et tu te bases sur l'event OnPacket pour aller lire ta réception;
    sinon il y a OnRxBuf ou OnRxChar pour t'indiquer quand des données arrivent sur le port et les lire;

    Pour l'écriture je pense que tu peux te simplifier la vie avec l'envoi complet de ton buffer en une fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
      i, len: integer;
      buf: TByteDynArray;
    begin
     
      len:= length(Buffer);
      SetLength(buf, len);
      for i:= 0 to len-1 do buf[i]:= Buffer[i+1];
        FComPort.Write(Buf, len);
    puis tu guettes OnTxEmpty, puis ta réponse....

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 2
    Par défaut
    Merci beaucoup istam3, je vais regarder à ce que tu m'as expliqué. ;-)

Discussions similaires

  1. envoi d'un fichier sur port RS232
    Par danydan01 dans le forum Qt
    Réponses: 4
    Dernier message: 20/05/2010, 15h13
  2. [WD14] lecture sur port Rs232
    Par NICO7285 dans le forum WinDev
    Réponses: 9
    Dernier message: 12/08/2009, 22h49
  3. Réponses: 1
    Dernier message: 16/09/2008, 13h30
  4. écriture sur Port RS232
    Par Emyleet dans le forum C++
    Réponses: 15
    Dernier message: 24/04/2008, 14h58
  5. [VB6] Communication binaire sur port RS232
    Par Oseval dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 12/04/2006, 12h53

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