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 et TBlockSerial : erreur 22 à la connexion [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2013
    Messages : 137
    Points : 292
    Points
    292
    Billets dans le blog
    2
    Par défaut Synaser et TBlockSerial : erreur 22 à la connexion
    Bjr à vous et bonnes fêtes,

    J'utilise Synaser pour communiquer avec un port série .

    Comme je suis sous Linux et que je n'ai pas de matériel physique, je fais une émulation avec socat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    socat PTY,link=/tmp/ttyS0,raw,echo=0 PTY,link=/tmp/ttyS1,raw,echo=0
    Sous Lazarus, j'ouvre un port série dont le nom m'a été indiqué par dmesg

    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
     
      // Paramètres de connexion du port
      Baudrate        := 115200;
      NbDataBits      := 8;
      StopBits        := SB1;
      Parity          := 'N';
      SoftFlowControl := false;
      HardFlowControl := false;
     
      result := -1;
      ...
      FCommPort := '/dev/pts/4';
     
      try
        self.Connect(FCommPort);
        QAfficherMessage(FCommPort);
        self.Config(BaudRate, NbDataBits, Parity, StopBits, SoftFlowControl, HardFlowControl);
    A l'exécution, j'obtiens l'erreur 22 au droit de self.Connect(FCommPort);

    Je ne sais que faire et je suis bloqué (toujours ce manque de documentation et d'exemples).

    C'est 'time consuming', aléatoire, énervant, hors métier et çà me fatigue tellement que j'envisage sérieusement de sous-traiter cette partie

    Nom : erreur_22.png
Affichages : 62
Taille : 42,1 Ko




    Cdlt

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 690
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 690
    Points : 12 363
    Points
    12 363
    Par défaut
    Salut,
    Citation Envoyé par JP CASSOU Voir le message
    A l'exécution, j'obtiens l'erreur 22 au droit de self.Connect(FCommPort);

    C'est 'time consuming', aléatoire, énervant, hors métier et çà me fatigue tellement que j'envisage sérieusement de sous-traiter cette partie
    C'est l'erreur qui est aléatoire ?

    Sinon, un truc qui aurait pu être sympa, c'est les lignes 2117 à 22, non ?
    Citation Envoyé par JP CASSOU Voir le message
    Nom : synaper_error.png
Affichages : 51
Taille : 6,1 Ko
    qu'on sache de quoi ça cause...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2013
    Messages : 137
    Points : 292
    Points
    292
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Salut,


    C'est l'erreur qui est aléatoire ?



    Sinon, un truc qui aurait pu être sympa, c'est les lignes 2117 à 22, non ?

    qu'on sache de quoi ça cause...
    L'erreur est systématique.

    L'exception est levée par la fonction ExceptCheck, qui est appelée depuis de nombreux endroits. Bref un jeu de piste agaçant: par exemple dans synaser.pas:

    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
     
    614:    procedure ExceptCheck; virtual;
    957:  ExceptCheck;
    969:  ExceptCheck;
    1001:  ExceptCheck;
    1052:  ExceptCheck;
    1161:  ExceptCheck;
    1266:  ExceptCheck;
    1283:  ExceptCheck;
    1359:  ExceptCheck;
    1455:  ExceptCheck;
    1473:  ExceptCheck;
    1500:  ExceptCheck;
    1633:  ExceptCheck;
    1641:  ExceptCheck;
    1649:  ExceptCheck;
    1658:  ExceptCheck;
    1817:  ExceptCheck;
    1859:  ExceptCheck;
    1929:  ExceptCheck;
    1945:  ExceptCheck;
    1957:  ExceptCheck;
    1975:  ExceptCheck;
    2108:procedure TBlockSerial.ExceptCheck;
    2132:  ExceptCheck;
    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
     
    procedure TBlockSerial.ExceptCheck;
    var
      e: ESynaSerError;
      s: string;
    begin
      if FRaiseExcept and (FLastError <> sOK) then
      begin
        s := GetErrorDesc(FLastError);
        e := ESynaSerError.CreateFmt('Communication error %d: %s', [FLastError, s]);
        e.ErrorCode := FLastError;
        e.ErrorMessage := s;
        raise e;
      end;
    end;
    J'en ai franchement marre de batailler avec des composants qui ne sont pas documentés / ne fonctionnent pas / sont difficilement utilisables .
    Je suis développeur d'applications, pas programmeur de composants / système. A quand des composants (gratuits ou payants) documentés, fonctionnels et faciles d'utilisation ???
    J

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 690
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 690
    Points : 12 363
    Points
    12 363
    Par défaut
    Citation Envoyé par JP CASSOU Voir le message
    L'exception est levée par la fonction ExceptCheck, qui est appelée depuis de nombreux endroits.
    Plus qu'à y aller en pas-à-pas et au moment de l'erreur, menu Voir / Fenêtres de débogage / Pile d'appels.

    Ça devrait mettre sur la piste (j'espère)…
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2013
    Messages : 137
    Points : 292
    Points
    292
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Plus qu'à y aller en pas-à-pas et au moment de l'erreur, menu Voir / Fenêtres de débogage / Pile d'appels.

    Ça devrait mettre sur la piste (j'espère)…
    Je n'arrive à rien.

    TLazSerial: rien à faire
    Sdpo: rien à faire. Erreurs incompréhensibles
    Le reste: idem

    Cà me gonfle.

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    3 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : mars 2005
    Messages : 3 393
    Points : 9 964
    Points
    9 964
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FCommPort := '/dev/pts/4'
    Malgré le message 'argument incorrect', je suppose que le seul de la fonction Connect est le bon nom de port, puisque tu l'as obtenu de dmesg, bien que sa syntaxe soit surprenante si j'en crois ceci :
    Citation Envoyé par http://www.linfo.org/dmesg.html
    And the following tells dmesg to show all serial ports (which are represented by the string tty):

    dmesg | grep -i tty
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 690
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 690
    Points : 12 363
    Points
    12 363
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    bien que sa syntaxe soit surprenante si j'en crois ceci :
    Ah pas mal !

    Sur ma babasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # dmesg | grep -i tty
    [    0.000000] console [tty0] enabled
    [    0.321491] 0000:00:06. : ttyS0 at I/O 0x3f8  (irq =  4) is a 16550A
    [    0.341802] 0000:00:03.3: ttyS1 at I/O 0x3240 (irq = 17) is a 16550A
    (à peine édité pour un bel alignement)
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2013
    Messages : 137
    Points : 292
    Points
    292
    Billets dans le blog
    2
    Par défaut
    Résolu le pb de l'erreur 9 Maintenant, j'ai l'erreur 22 . Voici la fonction d'initialisation de TDistoX2Connexion descendant de TBlockSerial:

    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
     
    function TDistoX2Connexion.InitialiserEtConnecter(const DeviceCom: string;
                                                      const TimeOutInSecondes: integer;
                                                      const ProcTransmitMessage: TProcOfObjectWithOneStringParameter;
                                                      const ProcOfObjectWithAShot: TProcOfObjectWithAShot;
                                                      const ProcOnStatus: THookSerialStatus;
                                                      const ProcOnRXData: TNotifyEvent): integer;
    var
      SoftFlowControl, HardFlowControl: boolean;
      BaudRate, NbDataBits, StopBits: integer;
      Parity: char;
    begin
      result := -1;
      Baudrate        := 9600;
      NbDataBits      := 8;
      StopBits        := SB1;
      Parity          := 'N';
      SoftFlowControl := false;          // @param(softflow Enable XON/XOFF handshake.)
      HardFlowControl := false;          // @param(hardflow Enable CTS/RTS handshake.)}
     
      FProcQAfficherMessage      := ProcTransmitMessage;
      FProcOfObjectWithAShot     := ProcOfObjectWithAShot;
      FTimeOutInMilliseconds     := 1000 * TimeOutInSecondes;
     
      QAfficherMessage('--> Cloture du port si déjà ouvert');
      //Deconnecter();
      FCommPort                  := DeviceCom;
      self.RaiseExcept           := true;
      self.LinuxLock             := False; // pour éviter l'erreur 9
      QAfficherMessage('--> Tentative de connexion sur ' + FCommPort);
      try
        self.Connect(FCommPort);  // Connect() TOUJOURS avant Config()
        self.Config(BaudRate, NbDataBits, Parity, StopBits, SoftFlowControl, HardFlowControl);
     
        // Ces deux événements doivent être paramétrés APRES ouverture du port
        //self.OnRxData := ProcOnRXData;
        //self.OnRxData        := ProcOnRXData;
        self.OnStatus := ProcOnStatus;
        Application.ProcessMessages;
        Result := self.LastError;
        QAfficherMessage(Format('Dernier retour: %d', [self.LastError]));
     
      except
        QAfficherMessage(Format('*** Erreur %d - %s', [self.LastError, self.LastErrorDesc]));
        Deconnecter();
      end;
    end;
    et la pile d'appels

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #0 fpc_raiseexception at :0
    #1 TBLOCKSERIAL__EXCEPTCHECK(<error reading variable>) at synaser.pas:2119
    #2 TBLOCKSERIAL__MODEMSTATUS(<error reading variable>) at synaser.pas:1975
    #3 TBLOCKSERIAL__SETRTSF(true, <error reading variable>) at synaser.pas:1718
    #4 TBLOCKSERIAL__CONNECT(0xb7fc668c '/dev/pts/5', <error reading variable>) at synaser.pas:997
    #5 TDISTOX2CONNEXION__INITIALISERETCONNECTER(0xb7fc668c '/dev/pts/5', 30, 0x80951a0 <TFORM1__QAFFICHERMESSAGE>, 0x0, 0x8095320 <TFORM1__ONDISTOXSTATUS>, 0x0, <error reading variable>) at unitcommdistoxcommport.pas:309
    #6 TFORM1__BTNOUVRIRPORTCLICK(0xb6edf190, <error reading variable>) at unit1.pas:64
    #7 TCONTROL__CLICK(<error reading variable>) at ./include/control.inc:2913
    #8 TBUTTONCONTROL__CLICK(<error reading variable>) at ./include/buttoncontrol.inc:55
    #9 TCUSTOMBUTTON__CLICK(<error reading variable>) at ./include/buttons.inc:169
    #10 TBUTTONCONTROL__WMDEFAULTCLICKED({MSG = 66567, WPARAM = -1210104519, LPARAM = -1215409714, RESULT = -1073747752, WPARAMLO = 17721, WPARAMHI = 47071, LPARAMLO = 20942, LPARAMHI = 46990, RESULTLO = 59608, RESULTHI = 49151}, <error reading variable>) at ./include/buttoncontrol.inc:21
    #11 SYSTEM$_$TOBJECT_$__$$_DISPATCH$formal at :0
    #12 ?? at :0

  9. #9
    Membre confirmé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 445
    Points : 617
    Points
    617
    Par défaut
    Dans ce lien, je vois, au paragraphe des "Commandes générales" que l'erreur 22 correspond à "not found".

    Êtes-vous sûr de votre adresse émulée ?

    Cordialement.

    Pierre

  10. #10
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2013
    Messages : 137
    Points : 292
    Points
    292
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Dans ce lien, je vois, au paragraphe des "Commandes générales" que l'erreur 22 correspond à "not found".

    Êtes-vous sûr de votre adresse émulée ?

    Cordialement.

    Pierre

    J'avance à petits pas:
    Un device /dev/ttyS4 a été créé avec socat.

    Depuis mon prog Lazarus, la connexion s'établit. J'ai bien sûr accroché une procédure à l'événement OnStatus à mon objet descendant de TBlockSerial:
    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
     
    procedure TForm1.OnDistoXStatus(Sender: TObject; Reason: THookSerialReason; const Value: string);
    var
      MyOP: byte;
      MyMesureVisee: TMesureViseeDistoX;
      MyVectorData, MyGCalibrationData, MyMCalibrationData: TVectorDataDistoX;
    begin
      QAfficherMessage(Format('OnDistoXStatus appelé: Code: %d', [Ord(Reason)]));
      case Reason of
        HR_SerialClose:
          begin
            QAfficherMessage('HR_Serial_Close ' + Value);
            ShowMessage(Format('%s est fermé', [Value]));
     
          end;
        HR_Connect:
          begin
            QAfficherMessage('HR_Connect' + Value);
            ShowMessage(Format('%s est ouvert', [Value]));
          end;
        HR_CanRead:
          begin
            QAfficherMessage('HR_CanRead' + Value);
            (*while (FPiloteDistoX.LireEtDecoderBuffer8Bytes(MyOP,
                                                           MyMesureVisee,
                                                           MyVectorData,
                                                           MyGCalibrationData,
                                                           MyMCalibrationData)) do
            begin
     
            end;
            //*)
          end;
        HR_CanWrite:
          begin
     
          end;
        HR_ReadCount:
          begin
     
          end;
        HR_WriteCount:
          begin
     
          end;
        HR_Wait:
          begin
             QAfficherMessage('HR_Wait' + Value);
          end;
      else
         QAfficherMessage('HR_Unknown' + Value);
      end;
      //Application.ProcessMessages;
    end;
    Cette procédure est déclenchée par l'ouverture et la fermeture du port. Aucune réaction lorsque j'envoie des données sur /dev/ttyS4, alors qu'il devrait y en avoir une

  11. #11
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 259
    Points : 3 198
    Points
    3 198
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par JP CASSOU Voir le message
    L'erreur est systématique.

    L'exception est levée par la fonction ExceptCheck, qui est appelée depuis de nombreux endroits. Bref un jeu de piste agaçant: par exemple dans synaser.pas:

    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
     
    614:    procedure ExceptCheck; virtual;
    957:  ExceptCheck;
    969:  ExceptCheck;
    1001:  ExceptCheck;
    1052:  ExceptCheck;
    1161:  ExceptCheck;
    1266:  ExceptCheck;
    1283:  ExceptCheck;
    1359:  ExceptCheck;
    1455:  ExceptCheck;
    1473:  ExceptCheck;
    1500:  ExceptCheck;
    1633:  ExceptCheck;
    1641:  ExceptCheck;
    1649:  ExceptCheck;
    1658:  ExceptCheck;
    1817:  ExceptCheck;
    1859:  ExceptCheck;
    1929:  ExceptCheck;
    1945:  ExceptCheck;
    1957:  ExceptCheck;
    1975:  ExceptCheck;
    2108:procedure TBlockSerial.ExceptCheck;
    2132:  ExceptCheck;
    Salut
    J'ai horreur de ce genre de truc dans la gestion des erreurs, c'est une vrai plaie à déboguer. Le seul moyen commenter la procedure ExceptCheck partout dans le code.
    J'avais eu ce genre de problème avec GLScene et le code de gestion de l'audio avec OpenAL

    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  12. #12
    Membre confirmé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 445
    Points : 617
    Points
    617
    Par défaut
    Dans une petite application qui me sert à lire les données d'un GPS et qui utilise "synaser", j'ai accroché à "onStatus" une procédure équivalente à la votre : elle est appelée en permanence.

    Cordialement.

    Pierre

  13. #13
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2013
    Messages : 137
    Points : 292
    Points
    292
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Dans une petite application qui me sert à lire les données d'un GPS et qui utilise "synaser", j'ai accroché à "onStatus" une procédure équivalente à la votre : elle est appelée en permanence.

    Cordialement.

    Pierre
    Un exemple ? Utilisation d'un TTimer ?

  14. #14
    Membre confirmé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 445
    Points : 617
    Points
    617
    Par défaut
    Citation Envoyé par JP CASSOU Voir le message
    Un exemple ? Utilisation d'un TTimer ?
    Pas de timer.

    Le programme :

    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
    program LienCom;
     
    {$mode objfpc}{$H+}
     
    uses
      {$IFDEF UNIX}{$IFDEF UseCThreads}
      cthreads,
      {$ENDIF}{$ENDIF}
      Interfaces, // this includes the LCL widgetset
      Forms, PgPrinc
      { you can add units after this };
     
    {$R *.res}
     
    begin
      RequireDerivedFormResource := True;
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    L'unité du programme :
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    unit PgPrinc;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
      Buttons, IniFiles, Synaser;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        AuDessus: TCheckBox;
        NomPort: TComboBox;
        Effacer: TButton;
        Envoyer: TButton;
        Emission: TEdit;
        Quitter: TBitBtn;
        Connecter: TButton;
        Deconnecter: TButton;
        ChoixBauds: TComboBox;
        Label2: TLabel;
        Label3: TLabel;
        Label1: TLabel;
        MemoData: TMemo;
        procedure AuDessusClick(Sender: TObject);
        procedure ChoixBaudsCloseUp(Sender: TObject);
        procedure ConnecterClick(Sender: TObject);
        procedure DeconnecterClick(Sender: TObject);
        procedure EffacerClick(Sender: TObject);
        procedure EnvoyerClick(Sender: TObject);
        procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
        procedure FormCreate(Sender: TObject);
        procedure QuitterClick(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
        PortCOM: TBlockSerial;
        ListeCOM: string;
        InfoCOM: string;
        Stop: boolean;
        NbBauds: integer;
        FchIni: TIniFile;
        procedure OnDistoXStatus(Sender: TObject; Reason: THookSerialReason; const Value: string);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FchIni := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
      with FchIni do    {Récupération des valeurs enregistrées dans le fichier INI}
      begin
        NomPort.Text := ReadString('PrmCOM', 'Port', 'COM1');
        ChoixBauds.ItemIndex := ReadInteger('PrmCOM', 'NbBauds', 1);
      end;
      NomPort.Items.CommaText:= GetSerialPortNames;
      AuDessusClick(Sender);
    end;
     
    procedure TForm1.QuitterClick(Sender: TObject);
    begin
      DeconnecterClick(Sender);
    end;
     
    procedure TForm1.ConnecterClick(Sender: TObject);
    begin
      if Assigned(PortCOM) then
        PortCOM.Free;
      Stop := False;
      PortCOM := TBlockSerial.Create;
      PortCOM.OnStatus:= @OnDistoXStatus;
      NbBauds := StrToInt(ChoixBauds.Items[ChoixBauds.ItemIndex]);
      try
    //    MemoData.Lines.Add(PortCOM.ATCommand('AT+CPAS'));
        PortCOM.Connect(NomPort.Items[NomPort.ItemIndex]);
        PortCOM.Config(NbBauds, 8, 'N', 1, False, False);
        while not Stop do
        begin
          try
            InfoCOM := PortCOM.Recvstring(2000);
            if InfoCOM <> '' then
              MemoData.Lines.Add(InfoCOM);
            Application.ProcessMessages;
          except
          end;
        end;
      finally
        DeconnecterClick(Sender);
      end;
    end;
     
    procedure TForm1.DeconnecterClick(Sender: TObject);
    begin
      Stop := True;
      if Assigned(PortCOM) then
        FreeAndNil(PortCOM);
    end;
     
    procedure TForm1.EffacerClick(Sender: TObject);
    begin
      MemoData.Clear;
    end;
     
    procedure TForm1.EnvoyerClick(Sender: TObject);
    begin
      if Emission.Text <> '' then
        PortCOM.SendString(Emission.Text);
    end;
     
    procedure TForm1.ChoixBaudsCloseUp(Sender: TObject);
    begin
      NbBauds := StrToInt(ChoixBauds.Items[ChoixBauds.ItemIndex]);
    end;
     
    procedure TForm1.AuDessusClick(Sender: TObject);
    begin
      if AuDessus.Checked then
        FormStyle := fsStayOnTop
      else
        FormStyle := fsNormal;
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
    begin
      DeconnecterClick(Sender);
      with FchIni do
      begin
        WriteString('PrmCOM', 'Port', NomPort.Text);
        WriteInteger('PrmCOM', 'NbBauds', ChoixBauds.ItemIndex);
      end;
    end;
     
    procedure TForm1.OnDistoXStatus(Sender: TObject; Reason: THookSerialReason; const Value: string);
    var
      MyOP: byte;
    begin
    //  ShowMessage(Format('OnDistoXStatus appelé: Code: %d', [Ord(Reason)]));
      case Reason of
        HR_SerialClose:
          begin
            ShowMessage(Format('%s est fermé', [Value]));
     
          end;
        HR_Connect:
          begin
            ShowMessage(Format('%s est ouvert', [Value]));
          end;
        HR_CanRead:
          begin
            ShowMessage('HR_CanRead' + Value);
          end;
        HR_CanWrite:
          begin
            ShowMessage('HR_CanWrite' + Value);
          end;
        HR_ReadCount:
          begin
            ShowMessage('HR_ReadCount' + Value);
          end;
        HR_WriteCount:
          begin
            ShowMessage('HR_WriteCount' + Value);
          end;
        HR_Wait:
          begin
             ShowMessage('HR_Wait' + Value);
          end;
      else
         ShowMessage('HR_Unknown' + Value);
      end;
      //Application.ProcessMessages;
    end;
     
    end.
    et le fichier lfm correspondant :

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    object Form1: TForm1
      Left = 3
      Height = 455
      Top = 151
      Width = 357
      Caption = 'Interface Port COM'
      ClientHeight = 455
      ClientWidth = 357
      OnClose = FormClose
      OnCreate = FormCreate
      LCLVersion = '1.6.4.0'
      object MemoData: TMemo
        Left = 0
        Height = 255
        Top = 175
        Width = 357
        Anchors = [akTop, akLeft, akRight, akBottom]
        ScrollBars = ssAutoVertical
        TabOrder = 0
      end
      object Label1: TLabel
        Left = 25
        Height = 13
        Top = 19
        Width = 72
        Caption = 'Choix du port :'
        ParentColor = False
      end
      object Label2: TLabel
        Left = 25
        Height = 13
        Top = 54
        Width = 97
        Caption = 'Choix de la vitesse :'
        ParentColor = False
      end
      object ChoixBauds: TComboBox
        Left = 135
        Height = 21
        Top = 50
        Width = 80
        ItemHeight = 13
        ItemIndex = 1
        Items.Strings = (
          '2400'
          '4800'
          '9600'
          '19200'
          '38400'
          '115200'
        )
        OnCloseUp = ChoixBaudsCloseUp
        TabOrder = 1
        Text = '4800'
      end
      object Label3: TLabel
        Left = 225
        Height = 13
        Top = 54
        Width = 29
        Caption = 'bauds'
        ParentColor = False
      end
      object Connecter: TButton
        Left = 15
        Height = 25
        Top = 85
        Width = 75
        Caption = 'Connecter'
        OnClick = ConnecterClick
        TabOrder = 2
      end
      object Deconnecter: TButton
        Left = 100
        Height = 25
        Top = 85
        Width = 75
        Caption = 'Déconnecter'
        OnClick = DeconnecterClick
        TabOrder = 3
      end
      object Quitter: TBitBtn
        Left = 270
        Height = 25
        Top = 85
        Width = 75
        DefaultCaption = True
        Kind = bkClose
        ModalResult = 11
        OnClick = QuitterClick
        TabOrder = 4
      end
      object Emission: TEdit
        Left = 15
        Height = 21
        Top = 132
        Width = 245
        TabOrder = 5
      end
      object Envoyer: TButton
        Left = 270
        Height = 25
        Top = 130
        Width = 75
        Caption = 'Envoyer'
        OnClick = EnvoyerClick
        TabOrder = 6
      end
      object Effacer: TButton
        Left = 185
        Height = 25
        Top = 85
        Width = 75
        Caption = 'Effacer'
        OnClick = EffacerClick
        TabOrder = 7
      end
      object AuDessus: TCheckBox
        Left = 15
        Height = 17
        Top = 435
        Width = 131
        Anchors = [akLeft, akBottom]
        Caption = 'Fenêtre toujours visible'
        Checked = True
        OnClick = AuDessusClick
        State = cbChecked
        TabOrder = 8
      end
      object NomPort: TComboBox
        Left = 135
        Height = 21
        Top = 15
        Width = 80
        ItemHeight = 13
        TabOrder = 9
        Text = 'NomPort'
      end
    end
    Cordialement.

    Pierre

  15. #15
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2013
    Messages : 137
    Points : 292
    Points
    292
    Billets dans le blog
    2
    Par défaut
    Merci pour ce travail, mais chez moi çà fonctionne très mal
    - Trames non trasmises
    - Blocages, freezes

    Il serait bon qu'une équipe du forum Lazarus développe une bonne fois pour toutes un composant fiable , documenté et 100% fonctionnel pour Delphi et Lazarus

  16. #16
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 690
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 690
    Points : 12 363
    Points
    12 363
    Par défaut
    Citation Envoyé par JP CASSOU Voir le message
    Résolu le pb de l'erreur 9
    Super ! On découvre cette erreur...

    Citation Envoyé par JP CASSOU Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #5 TDISTOX2CONNEXION__INITIALISERETCONNECTER(0xb7fc668c '/dev/pts/5', 30, 0x80951a0 <TFORM1__QAFFICHERMESSAGE>, 0x0, 0x8095320 <TFORM1__ONDISTOXSTATUS>, 0x0, <error reading variable>) at unitcommdistoxcommport.pas:309
    #6 TFORM1__BTNOUVRIRPORTCLICK(0xb6edf190, <error reading variable>) at unit1.pas:64
    Il aurait été intéressant de voir ce qui se cache aux lignes unit1.pas:64 et unitcommdistoxcommport.pas:309.

    PS : il sort d'où, ce /dev/pts/5 ? Pourquoi ne pas utiliser la suggestion d'Yves (/dev/ttySx, 5 ?) ?

    Citation Envoyé par ChPr Voir le message
    Le programme :
    L'unité du programme :
    et le fichier lfm correspondant :
    Il nous manque juste le fichier .ini, dans lequel je suppose que se cache le /dev/ttySx suggéré par Yves ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 609
    Points : 4 033
    Points
    4 033
    Par défaut
    hello,
    no problem avec mon composant TLazserial (qui utilise une version modifiée de synaser) sous Ubuntu :
    commande de socat :
    jurassic-PC:~$ socat -d -d PTY PTY
    socat[5876] N PTY is /dev/pts/2
    socat[5876] N PTY is /dev/pts/3
    socat[5876] N starting data transfer loop with FDs [5,5] and [7,7]
    j'utilise mon exemple sertest pour simuler un gps série sur le port /dev/pts/3 :

    Nom : GPS Simulator 0.2_049.png
Affichages : 31
Taille : 36,6 Ko

    je réceptionne les trames sur l'autre port /dev/pts/2 dans une autre instance de sertest configurée en réception :

    Nom : Peek TLazserial.gif
Affichages : 29
Taille : 85,4 Ko


    un truc à savoir : pour pouvoir utiliser les ports série en tant que user non root il faut faire partie du groupe dialout :
    sudo usermod -a -G dialout nomuser
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  18. #18
    Membre confirmé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 445
    Points : 617
    Points
    617
    Par défaut
    Citation Envoyé par Jipété Voir le message
    ... Il nous manque juste le fichier .ini, dans lequel je suppose que se cache le /dev/ttySx suggéré par Yves ?
    Avec mon Raspberry Pi 3B+, j'ai :

    • /dev/ttyS0 si j'utilise un GPS connecté aux broches Tx et Rx des GPIO
    • /dev/ttyACM0 si j'utilise un GPS connecté à un port USB.

    Cordialement.

    Pierre

  19. #19
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2013
    Messages : 137
    Points : 292
    Points
    292
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    no problem avec mon composant TLazserial (qui utilise une version modifiée de synaser) sous Ubuntu :

    un truc à savoir : pour pouvoir utiliser les ports série en tant que user non root il faut faire partie du groupe dialout :


    Ami calmant, J.P

    Bjr,
    Chez moi, rien ne fonctionne: Erreur 22 et 9992

    J'ai bien configuré mes ports

    Pièce jointe 527226




    Je pense que je vais faire passer mon projet parce que je ne comprends pas grand chose
    PiloteTDistoXComm_v2.tar.gz
    Images attachées Images attachées  

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 609
    Points : 4 033
    Points
    4 033
    Par défaut
    hello,
    Citation Envoyé par JP CASSOU Voir le message
    Bjr,
    Chez moi, rien ne fonctionne: Erreur 22 et 9992
    1 - Quel est ton O.S ?
    2 - As-tu essayé avec mon exemple sertest qui est inclus dans le paquet TLazSerial ? Tu ne nous montres pas ton code qui est peut-être en cause.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Erreur 633 en connexion via modem interne
    Par busy999 dans le forum Dépannage et Assistance
    Réponses: 7
    Dernier message: 29/07/2006, 00h40
  2. erreur lors de connexion avec Database designer 4
    Par magic charly dans le forum Designer
    Réponses: 1
    Dernier message: 10/04/2006, 15h37
  3. erreur putfile() sur connexion FTP
    Par stefane1981 dans le forum MFC
    Réponses: 10
    Dernier message: 23/09/2005, 16h30
  4. erreurs "too many connexion"... etc
    Par Jamie88 dans le forum Requêtes
    Réponses: 6
    Dernier message: 01/09/2005, 07h32
  5. [BDD] Erreur dans la connexion à une base MySQL
    Par dodo10 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 24/01/2005, 20h52

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