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

Lazarus Pascal Discussion :

TLazSerial communique (mal) avec Arduino UNO [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 147
    Points : 38
    Points
    38
    Par défaut TLazSerial communique (mal) avec Arduino UNO
    Bonjour,


    J'ai écris un petit programme avec Lazarus 1.8.4 permettant d'échanger
    des données via la liaison série avec une carte arduino UNO.

    J'utilise le composant TLazSerial.

    Je rencontre le problème suivant : Quand la carte UNO émet, par exemple "911111000109"
    je reçois parfois le paquet (la chaîne de caractère) découpé en deux morceaux dont les longueurs peuvent
    varier, par exemple "9111" puis "11000109", dans l'évènement RxData du composant.

    J'ai tenté la même chose avec Delphi 7.1 et le composant Comport, idem, même
    découpage aléatoire ...

    Les paramètres du protocole (bit de stop, parité, vitesse etc.) ont été soigneusement
    vérifiés et accordés, le problème ne semble pas venir de là.

    Mes expériences tendent à montrer que le problème vient de la carte arduino
    mais j'écris ici dans l'hypothèse où quelque-chose m'aurait échappé coté
    programme en pascal (Lazarus ou Delphi).

    Quelqu'un a-t-il eu ce problème ? (et la résolu ... )


    Eric

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    ce n'est pas TLazserial qui communique mal avec l'arduino, mais c'est certainement qu'il n'est pas utilisé de façon optimale. Je ne sais pas ce qui est généré par l'arduino et si c'est suite à une commande ou une capture à la volée mais si il n'y a pas de marqueur de fin d'un envoi de données, on aura du mal à se synchroniser avec ce qui arrive, sinon on bufferise jusqu'à l'arrivée du marqueur de fin de trame ou alors on attend un nombre précis d'octets si celui-ci est constant.
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 147
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    ce n'est pas TLazserial qui communique mal avec l'arduino, mais c'est certainement qu'il n'est pas utilisé de façon optimale. Je ne sais pas ce qui est généré par l'arduino et si c'est suite à une commande ou une capture à la volée mais si il n'y a pas de marqueur de fin d'un envoi de données, on aura du mal à se synchroniser avec ce qui arrive, sinon on bufferise jusqu'à l'arrivée du marqueur de fin de trame ou alors on attend un nombre précis d'octets si celui-ci est constant.
    Ami calmant, J.P
    Ok, je comprends mieux. J'utilise la commande serial.print(String) de l'arduino. J'ai essayé PrintLn qui envoie un CR/LN à la fin, ça n'a rien changé. Comment synchroniser ces deux appareils ? Comment spécifier un marqueur de fin et/ou un nb d'octets à attendre ?

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    Quel est ton code de réception ? si l'arduino envoie un CRLF avec un println utilises-tu ce qui est fait dans l'exemple sertest qui permet de se synchroniser avec le caractère 10 :
    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
    procedure TFMain.SerialRxData(Sender: TObject);var Str : string;
    begin
      Str :=  Serial.ReadData;
      CurPos := Pos( Char(10) ,Str);
      if CurPos = 0 then begin
        FTempStr := FTempStr + Str;
      end
      else begin
        FTempStr := FTempStr + Copy( Str, 1, CurPos-1);
        Memo.Lines.BeginUpdate;
        Memo.Lines.Add(FtempStr);
         Memo.Lines.EndUpdate;
        Memo.SelStart := Length(Memo.Lines.Text)-1;
        Memo.SelLength:=0;
        AnalyseTrames(FtempStr);
        FTempStr := Copy(Str,CurPos +1, Length(Str) - CurPos);
      end;
    end;
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour .

    Question idiote, peut-être mais est-ce que les vitesses (en Bauds) sont bien les mêmes sur Arduino et LazSerial?

    Désolé, je viens de voir en relisant le premier post que ce point était vérifié.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 147
    Points : 38
    Points
    38
    Par défaut
    Merci. Je m'inspire de cela.



    Citation Envoyé par jurassic pork Voir le message
    Quel est ton code de réception ? si l'arduino envoie un CRLF avec un println utilises-tu ce qui est fait dans l'exemple sertest qui permet de se synchroniser avec le caractère 10 :
    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
    procedure TFMain.SerialRxData(Sender: TObject);var Str : string;
    begin
      Str :=  Serial.ReadData;
      CurPos := Pos( Char(10) ,Str);
      if CurPos = 0 then begin
        FTempStr := FTempStr + Str;
      end
      else begin
        FTempStr := FTempStr + Copy( Str, 1, CurPos-1);
        Memo.Lines.BeginUpdate;
        Memo.Lines.Add(FtempStr);
         Memo.Lines.EndUpdate;
        Memo.SelStart := Length(Memo.Lines.Text)-1;
        Memo.SelLength:=0;
        AnalyseTrames(FtempStr);
        FTempStr := Copy(Str,CurPos +1, Length(Str) - CurPos);
      end;
    end;

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 147
    Points : 38
    Points
    38
    Par défaut
    Oui, c'est le cas. Le problème semble venir du fait, comme l'a explique jurassic pork, que le récepteur, coté Lazarus,
    "attrape" les morceaux de paquets à volée sans rien connaitre à priori du nombre de caractères les constituants
    et/ou quel est leur délimiteur. Il faut donc stocker les morceaux reçus dans une chaine et
    et en extraire les paquets selon le codage choisi (délimiteur ou longueur du paquet).


    Citation Envoyé par naute Voir le message
    Bonjour .

    Question idiote, peut-être mais est-ce que les vitesses (en Bauds) sont bien les mêmes sur Arduino et LazSerial?

    Désolé, je viens de voir en relisant le premier post que ce point était vérifié.

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

Discussions similaires

  1. Réponses: 45
    Dernier message: 30/05/2017, 14h53
  2. Recyclage de clavier d'ordi portable avec Arduino Uno
    Par jeremygosset dans le forum Arduino
    Réponses: 3
    Dernier message: 24/06/2016, 23h58
  3. LIMIT calcul mal avec des JOIN
    Par FMaz dans le forum Requêtes
    Réponses: 21
    Dernier message: 12/07/2006, 03h37
  4. du mal avec les fichiers ressources
    Par keil dans le forum MFC
    Réponses: 1
    Dernier message: 01/02/2006, 02h46
  5. [POO] Un peu de mal avec les membres de ma classe
    Par Spack dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/11/2005, 03h41

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