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

EDI Delphi Discussion :

[Kylix] Aidez moi SVP -> Kylix et la liaison série


Sujet :

EDI Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut Aidez moi SVP -> Kylix et la liaison série
    : Bonjour, je suis un étudiant de BTS informatique et je suis en période de projet. Et je dois créer une DLL sous linux capable de gérer une liasion série avec une station météo et de stocker les données reçu dans une BDD. Mais en 2ans nous n'avons que programmer qu'une fois sous linux et je ne sais pas comment faire par mon manque d'expérience sous linux .
    Alors je suis la pour demandez de l'aide à qui voudra bien. Je vous remercie déja d'avoir lu ce message.
    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    Précise le langage utilisé. Il existe un composant appelé Async professional CLX ( framework de kylix compatible avec delphi et C++ builder ) qui gère très bien la liaison serie, pour l'installer c'est ardu mais ça marche bien avec l'interface delphi de kylix , par contre avec l'interface C++, il manque des fichiers (.hpp et .a par exemple ) pour compiler avec ce module ( va voir sur le public forum ). Ce module est le même que async pro VCL ( tu trouveras de l'aide sur le site developpez.com ). Basé si sur une programmation événementielle. Je te conseil fortement si tu es interressé par ce module de te documenter sur celui ci et de l'installer sous c++builder ( sous windows ) ou delphi pour le tester ( async pro VCL cette fois ci ) car l'installe sous kylix est chiante et te feras perdre du temps.

    http://sourceforge.net/projects/tpaproclx/

    sinon , et ça été mon choix, je me suis fait ma propre classe gérant la liaison serie avec la norme posix. Voici une doc super complette ( mais je te suggère de faire d'autres recherches ) :

    http://www.easysw.com/~mike/serial/

    En ce qui concerne les "DLL" sous linux ( je sais pas comment on appel ça sous linux ), je suis prenneur d'une doc.

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut merci pour le message mais...
    je travail en C++ sous Kylix et honnetement je n'ai pas trop compris l'utilisé de ces modules.
    Il existe des fonctions pour ouvir une liaison série non ???

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    ok, module = composant visuel pour moi, désolé. C'est à dire qu'avec ce composant ( qui s'utilise comme les autres , TEdit, TMemo , TButton etc ... ) tu peux ouvrir un port serie et y ecrire dedans ( propriété du composants pour la config, fonction pour lecture ecriture ). Quand le port serie reçois quelque chose , cela se traduit par un événement au même titre que la gestion d'un click de souris sur un bouton par exemple.

    télécharge la doc et tu verras.

    Perso je n'étais pas satisfait par ce composant ( pour async pro CLX , avec async pro VCL je sais pas) car ma programmation très séquencielle ( pilotage de machine ) pour mon appli ne pouvait pas se mélanger avec le côté programmation événementielle induit par le composant.

    Si tu n'utilises pas ce composant mais les appel systèmes POSIX ( regarde aussi dans le forum linux ), il y a deux fonctions select et poll qui sont intéressantes pour faire de la prog événementielle mais je ne suis pas spécialiste.

  5. #5
    mad
    mad est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Salut,

    j'ai développé des choses sous kylix fonctionnant avec le port série. Tu peux me poser tes questions de manière précises et j'essayerai de t'aider car j'ai aussi pas mal galéré pour faire ce que voulais avec le port série.

    @ +

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut hé bien heu....
    J'ai réussi la connexion au port mais j'arrive pas à lire le port, en fait mon collègue m'envoi des données par liaison série et dès que je les reçoit cela fait une erreur. Donc je suis bien connecté au port mais mon programme croit que c'est de la merde et il me met une erreur voila ma fonction lire :

    bool CSerial::Lire(void * Buffer, unsigned Size)

    {
    Buffer=NULL;
    //on lit le port
    bytes = read(hCom,Buffer,Size);
    if(bytes==-1)
    {
    cout<<"Erreur de lecture"<<endl;
    return 0;
    }

    cout<<" nb_bytes= "<<bytes;
    return 1;

    }

    et j'ai paramétré correctement je pense . J'"ai testé la liaison série sous windows par un programme sous windows "MTTY" donc le port n'est pas HS. aidez moi SVP

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    Salut,

    On peut savoir si tu utilises le composant AsyncPro CLX ou la structure termios de Posix ( ou autre j'suis pas non plus expert ) ?

    et puis comment t'as configuré ton port ( que dans le cas de posix , async je connais pas bien ).

    Sinon ton Buffer , m'ai d'avis qu'il devrai être pointeur de type char, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    char buffer ;
     
    read ( file_descriptor, & buffer, strlen ( & buffer ) );
    attention au \0 terminal d'une chaine !

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut voila
    voila la config du port et je n'utilise rien de spéciale
    struct termios option,ancienterm;


    hCom= open(Nomport,O_RDWR|O_NONBLOCK);

    if(hCom==-1)
    {
    cout<<"Erreur d'ouverture de fichier"<<endl;
    }

    //enregistre les paramètres actuels du port

    tcgetattr(hCom,&ancienterm);

    // Lecture des parametres courants
    tcgetattr(hCom,&option);

    /* Mode non-canonique avec echo */
    option.c_lflag = ECHO;

    // règle en NULL MODEM
    option.c_cflag |= CLOCAL;

    // On ignore les BREAK et les caracteres avec erreurs de parite
    option.c_iflag = IGNBRK | IGNPAR;

    // Pas de mode de sortie particulier
    option.c_oflag = 0;

    // On configure ici la vitesse souhaité
    switch (vitesse)
    {
    case 50: cfsetispeed(&option, B50);
    cfsetospeed(&option, B50);break;
    case 75: cfsetispeed(&option, B75);
    cfsetospeed(&option, B75);break;
    case 150: cfsetispeed(&option, B150);
    cfsetospeed(&option, B150); break;
    case 300: cfsetispeed(&option, B300);
    cfsetospeed(&option, B300); break;
    case 600: cfsetispeed(&option, B600);
    cfsetospeed(&option, B600); break;
    case 1200: cfsetispeed(&option, B1200);
    cfsetospeed(&option, B1200); break;
    case 2400: cfsetispeed(&option, B2400);
    cfsetospeed(&option, B2400); break;
    case 4800: cfsetispeed(&option, B4800);
    cfsetospeed(&option, B4800); break;
    case 9600: cfsetispeed(&option, B9600);
    cfsetospeed(&option, B9600); break;
    default: cfsetispeed(&option, B9600);
    cfsetospeed(&option, B9600); break;
    }

    // réglage du nombre de bytesde données
    option.c_cflag |= CS8;

    // réglage de la parité
    option.c_cflag &= ~ CSTOPB;

    // Caracteres immediatement disponibles
    option.c_cc[VMIN] = 1;
    option.c_cc[VTIME] = 0;

    // Sauvegarde des nouveaux parametres
    tcsetattr(hCom,TCSANOW,&option);

    // Passe en mode bloquant
    fcntl(hCom,F_SETFL,fcntl(hCom,F_GETFL)&~O_NONBLOCK);

    et pis çà marche pas

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut galère et çà marche po
    je crois que c'est posix

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut Aie
    je viens de trouver mon erreur j'arrive à communiquer aux autres par liaison série mais j'affche des conneries au début je crois que je nettoie pas le buffer au début du programme . Je me suis fait détruire par le prof qd il a vu mon erreur :-( là je dois chercher comment taiter la trame et surtout comment nettoyer le buffer... je vous tiendrez au courant ... merci pour votre aide

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    Je précise que je ne suis pas un dieux du code ni de linux, donc je n'ai pas bien creusé profond dans la signification des options.

    par COMPARAISON :

    tu ouvres ton fichiers port serie avec l'option pas de blocage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hCom= open(Nomport,O_RDWR|O_NONBLOCK);
    or à la fin du déclare un mode bloquant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fcntl(hCom,F_SETFL,fcntl(hCom,F_GETFL)&~O_NONBLOCK);
    je te propose plutôt ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hCom = open ( Nomport, O_RDWR | O_NOCTTY  ) ;
    note que O_NOCTTY suivant la doc posix, précise que le programme ne veut pas être le "terminal de controle" pour le port. De plus sans cette option, les entrées claviers affectent ton prog.

    Pour le mode lecture bloquante j'ai une version différente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fcntl (hCom, F_SETFL, 0) ;
    mais bon...

    pour le null modem, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    option.c_cflag |= ( CLOCAL | CREAD ) ;
    pour ma forme canonique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    option.c_lflag &= ~( ICANON | ECHO | ECHOE | ISIG) ;
    moi je suis en controle de flux logiciel mais ça pas l'air ton cas pour ma part donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    option.c_iflag |= ( IXON | IXOFF | IXANY ) ;
    moi je bloque le procéssus jusqu'à sa fin :

    peut être que ton time out est trop petit, fait le varier ( exprimé en 1/10 s ).


    j'ai un truc en plus pour les paramètres du port :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    option.c_cflag &= ~PARENB  ;   // pas de parité
     
    option.c_cflag &= ~CSTOPB  ;  // un bit de stop
     
    option.c_cflag &= ~CSIZE ;   //  masque la taille des caractères actuel
     
    option.c_cflag |= CS8 ;     //   mot de 8 bits
    et à la fin je vide les buffers entrées sorties :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tcflush ( hCom, TCIOFLUSH ) ;
    n'oublie pas de fermer le port à la fin de ton appli :

    donc en ajoutant les trucs différents un par un , je pense que tu peux y arriver.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    en relisant un peu mieux la doc , je me suis aperçu que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    option.c_cflag |= ( CLOCAL | CREAD ) ;
    l'option CREAD permet de "enable receiver" soit activer la reception ?

  13. #13
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut
    merci j'ai réusi à le faire marché mais là j'utilise ta fonction pour nettoyer le buffer et je reçois en gros de la merde avant la trame alors je comprend plus vé dvenir fou .
    Et pis j'ai po dit que tété un dieu mais tu te débrouille mieux que moi lol

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    ok , mais pour mon humilité c'est pour expliquer à tous que les options je ne les comprends pas toutes.

  15. #15
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut yo
    beh ouai c clair et je te comprend il ya tellement de fonctions et en plus l'aide est vraiment pas super bien faite..... là j'essaie de recevoir la trame d'une station météo, en théorie je dervais recevoir quelque chose de la forme FFFF............ et quelquechose mais cela foit commencé par FFFF mais après il n'y a pas de FF au 3 bytes . c'est étrange car moi je reçois : FFFFFFFFF...... donc c strange.
    Donc j'ai pensé ( oui çà arrive) ,
    Que ce doit être le buffeur qui n'est pas vide et il ya des trucs qui restent mais en fait je me suis servi de la fonction pour effacer le buffer que tu m'as donnés et çà n'a rien changé alors je cherche la solution.
    Dis moi tu connaitrais pas la fonction pour régler le time out ???
    J'essaie de chercher..+

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    le time out en reception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    option.c_cc [VMIN] = 0 ;   //n caractères attendus en reception
    option.c_cc [VTIME] = n ;  // timeout n/10 seconde
    bizzard ta trame, y a pas de \n pour la fin de trame et j'ai pas tout compris mais ton prompt est FFFF puis
    mais après il n'y a pas de FF au 3 bytes . c'est étrange car moi je reçois : FFFFFFFFF...... donc c strange.
    là je comprends pas. Si tu reçois un prompt ( où si j'ai bien compris deux d'affilés ), bein c'est du côté de ta station météo que ça déconne ?


    Sinon pour ma part , je n'ai pas eu de problème de buffer , voir même je ne les ai pas vidé quand je fesais mes tests.

    es tu obligé d'être en mode non canonique ? ( y a vraiment pas de \n à la fin de ta trame ?)

  17. #17
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut hé bien pour ma part
    je pense que la station météo ne déconne pas car nous avons testé ce que nous recevons grace à un logiciel sous windows par exemple :
    FF FF 06 00 82 01 43 05 96 39 00 00 06 A4

    Mais moi j'obtiens pas un truc correct. c'est bizzard. Et pis j'ai fais un truc qui ignore les break.
    mais là je ne recoit pas de /n.

    En fait non je crois que je suis pas obligés s'etre en mode non canonique d'autant plus que je ne sais pas trop ce que sait.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    si tu ne reçois pas de \n alors reste en non canonique. En effet le mode canonique fait que le port lit jusqu'à recevoir \n !

    pour le reste bon courage.

  19. #19
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut question bete ?
    comment on ce met en mode canonique me rappel plus ? :o

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    config.c_lflag |= ( ICANON | ECHO | ECHOE ) ;
    par contre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    option.c_cc [VMIN] = 0 ;   //n caractères attendus en reception 
    option.c_cc [VTIME] = n ;  // timeout n/10 seconde
    est à mon avis sans effet car cela correspond à des options pour la forme non canonique.

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

Discussions similaires

  1. Connection a une BD SQL SERVER Aidez Moi SVP????
    Par pop bob dans le forum Bases de données
    Réponses: 3
    Dernier message: 07/08/2005, 17h29
  2. Recuperation de ma base BD apres la sauvegarde Aidez Moi SVP
    Par pop bob dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/07/2005, 17h38
  3. J'ai du mal à me décider ! Aidez moi svp :)
    Par VanHelsing dans le forum Mobiles
    Réponses: 18
    Dernier message: 01/06/2005, 15h59
  4. Je vois pas d'où vient mon erreur!! Aidez moi SVP
    Par liliboms dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 04/04/2005, 09h25
  5. [Kylix] Aidez-moi -> LIAISON SERIE 2 le retour
    Par Oyoboy dans le forum EDI
    Réponses: 1
    Dernier message: 28/05/2004, 11h48

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