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 :

[Synaser] Écrire sur port USB [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Par défaut [Synaser] Écrire sur port USB
    Bonjour à tous,

    Je viens de me mettre sur un raspberry pi4 sous rasbian / lazarus et souhaite communiquer avec un arduino par cable USB.

    J'ai trouvé synaser et j'arrive a recevoir des données sur le raspberry (ca c'est pas mal )
    Par contre, je n'arrive pas a transmettre vers l'arduino (j'ai tester code en python et pas de probleme : ca marche !)

    En gros, je veux envoyer un caractere a la carte arduino, qui me le retourne pour me l'afficher dans un memo.

    Voici mon 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
    begin
      ser.Destroy;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      texte : string;
    begin
      texte := edit1.text ;
      ser.SendString(text+#13#10);
      timer1.Enabled:=true;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
       ser := TBlockSerial . create ;
       ser . Connect ( '/dev/ttyUSB0') ;
       ser . config ( 9600 , 8,  'N' ,  SB1 ,  false ,  false ) ;
       label1.Caption:= ser.Device;
    end;
     
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      x : integer;
      s : string;
    begin
     
         s:=  IntToHex( ser . RecvByte ( 500000) , 2);
         memo1.lines.Add ( IntToHex( ser . RecvByte ( 50000) , 1));
    end;
    c'est le block Button1.click qui poserait probleme

    J'atoute que j'ai essayé des composants tel que TLazSerial, TComPort, ... et tout plante


    Un grand merci pour votre aide et votre temps passé.

    elecpic

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    Hello,
    Citation Envoyé par elecpic Voir le message
    Par contre, je n'arrive pas a transmettre vers l'arduino (j'ai tester code en python et pas de probleme : ca marche !)


    En gros, je veux envoyer un caractere a la carte arduino, qui me le retourne pour me l'afficher dans un memo.


    J'ajoute que j'ai essayé des composants tel que TLazSerial, TComPort, ... et tout plante
    Regarde le projet exemple sertest de mon composant TLazSerial qui est un simulateur GPS qui peut envoyer des données sur un port série par un Timer toutes les 2 secondes et qui reçoit les données du port série par événement (pas besoin de timer). A noter que TLazserial utilise Synaser pour la couche liaison série.
    Si ton arduino renvoie ce qui est envoyé, logiquement en utilisant le projet sertest, tu devrais voir apparaître dans le Tmemo ce qui est envoyé par le simulateur GPS quand tu le mets en route.

    Ami calmant, J.P

  3. #3
    Membre confirmé

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Par défaut Installer TLazSerial
    Bonjour Jurassic pork,

    Je viens de relire mon post et j'ai mal formulé une phrase
    Il fallait comprendre : "Je n'arrive pas a installer les composants TLazSerial "
    Entièrement désolé.
    - J'ai téléchargé TLazSerial
    - Sous Lazarus, ouvrir paquet *.lpk
    - installer --> plantage à ce niveau

    Par ailleurs, synaser et installé sur le raspberry (aucun problème pour la réception, comme cité)

    J'ai une petite faim pour les composants visuels : et si tu pouvais m'aider dans l'installation de tes composants...

    Je te remercie beaucoup et te souhaite une bonne journée en attendant de te lire

    elecpic

  4. #4
    Membre expérimenté
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 161
    Par défaut
    Salut,
    Quelle version de Lazarus as-tu ? Il faut utiliser le Online Package Manager (paquet OnlinePackageManager) pour télécharger et installer la dernière version de TLazserial.

    Nullosse le plus nul des programmeurs

  5. #5
    Membre confirmé

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Par défaut ... Ca marche
    Bonjour Jurassic pork et Nullosse,

    Pour commencer, désolé pour cette réponse un peu tardive : j'était au boulot !

    Ce week-end, j'ai donc :
    - enlevé la carte SD du raspberry et fait un 'format'
    - installé Raspberry image et installer la dernière version proposée (Debian)
    - réinstallé Lazarus
    Puis j'ai suivi vos conseils :
    - installer sysnaspe depuis le 'OnLine Package Manager' de Lazarus
    - installer LazSerial depuis le 'OnLine Package Manager' de Lazarus

    ... et bien entendu fait quelques tests :
    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
     
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
      LazSerial;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        LazSerial1: TLazSerial;
        Memo1: TMemo;
        Timer1: TTimer;
        procedure Button1Click(Sender: TObject);
        procedure FormActivate(Sender: TObject);
        procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
        procedure Timer1Timer(Sender: TObject);
      private
     
      public
     
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.FormActivate(Sender: TObject);
    begin
    lazserial1.ShowSetupDialog;
    lazserial1.open;
     
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     lazserial1.WriteData(edit1.Text);
     timer1.Enabled:= true;
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
    begin
      lazserial1.Close;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      s : string;
    begin
      s := lazserial1.ReadData;
      if s<>'' then memo1.Lines.Add(s);
     
    end;
     
    end.
    Je sais que ce code est minimal, et pas top concernant le timer : Je continue mes travaux !

    La carte Arduino me renvoie bien la valeur envoyée.
    Je me penche maintenant sur le programme de démo GPS

    Merci pour vos précieux conseils et votre temps passé

    Sincèrement,


    elecpic

  6. #6
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 097
    Par défaut
    C’est moi, ou bien, c’est surprenant d’utiliser un timer pour recevoir des réponses sur ports Com/USB !

    Avec cette approche, il n’y a pas de risques de perdre des infos ?

    Cette discussion me donne envie de refaire des tests de Lazarus sur mon dernier Raspberry Pi4

  7. #7
    Membre confirmé

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Par défaut
    Non, pas de souci avec un timer. Il regarde toute les xx miliseconde si le buffer de réception est plein. Si vide, il renvoie -1, sinon il récupère la valeur. Le souci avec cette méthode est l utilisation accrue du processeur.
    Comme je l ai dit dans mon dernier post, mon code est brut de décoffrage, mais il fonctionne !
    J ai depuis fait des essais avec le composant lazserial, il possède une méthode qui, je pense, utilise les interruptions :autrement plus efficace. Le projet test de Mr jurassic Pork (et créateur du composant il me semble) est parlant.

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

Discussions similaires

  1. Lecture sur Port USB en C/C++
    Par gobelin88 dans le forum C++
    Réponses: 1
    Dernier message: 10/09/2007, 22h08
  2. Réponses: 5
    Dernier message: 12/06/2007, 17h52
  3. Envoyer une trame sur port USB
    Par Bocci dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 15/03/2007, 21h07
  4. Compatibilité clé usb 2.0 sur port usb 1.0 de mon portable?
    Par coubi64 dans le forum Périphériques
    Réponses: 2
    Dernier message: 22/10/2003, 18h57
  5. [TP]Impression sur port USB
    Par haypo dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 18/07/2003, 11h09

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