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 :

Communication RS232 avec un PIC via delphi


Sujet :

API, COM et SDKs Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Points : 2
    Points
    2
    Par défaut Communication RS232 avec un PIC via delphi
    Bonjour,

    j'ai fait le tour des tutos, des faq et autres mais je ne trouve pas mon bonheur.

    J'ai besoin de communiquer avec un PIC 16F876 interfacé avec un module RS232 pour récupérer les données stockées dans l'eeprom interne afin de traiter les résultats avec un programme delphi.

    Je travaille sous delphi 7 et j'ai essayé avec la librairie .dll RSCOM de Burkhard Kainka, mais je n'arrive pas a communiquer avec mon PIC

    Pour faire un test simple, j'ai programmé le PIC (en BASIC) avec un simple programme de réception (il attend un byte, ne fait rien d'autre qu'allumer une led si il a receptionné).

    *************************
    Define loader_used 1
    Define OSC 20

    recu var byte

    main :

    serin2 15,32,[hex recu]
    high portb.1

    goto main
    **************************

    D'autre part j'ai fait un petit programme delphi avec un bouton, lorsque j'appuie sur le bouton je fais simplement :

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    OpenCom('COM4: baud=19200 parity=N data=8 stop=1');
    sendByte(5);
    end;

    J'ai bien vérifié la config du port 4, c le bon port et je travaille bien 19200 bauds sans parité avec huit bits et un stop bit. Avec un terminal, le pic receptionne et la led s'allume. Avec mon prog delphi ca ne fonctionne pas.

    Que dois-je faire pour résoudre mon problème ?

    Merci d'avance

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Je te conseil une série de composants tous faits. Certaines libraires ne fonctionne plus très bien sous 2000 et XP.

    http://delphi.developpez.com/faq/?page=portseriepc
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    salut
    je pence que tu doit utiliser TComport cest mieu car il est donner avec la source
    en plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    OpenCom('COM4: baud=19200 parity=N data=8 stop=1'); 
    sendByte(5); 
    end;
    la tu férme pas votre port
    soit tu louvre dans oncréate et tu le férme dans ondéstroye
    jéspére que tu perd pas éspoir et jaime bien déscuter de sa
    bonne chance
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  4. #4
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    en plus pourqoi le port série
    il ya le port paralléle surtout que le port série utilise +-12v et le // 5v
    voir http://perso.easynet.fr/~chrisg/mnu1.htm
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  5. #5
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    743
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 743
    Points : 500
    Points
    500
    Par défaut
    Le choix du port serie est simple car si mes souvenirs sont bon le pic que tu utilises possede lui meme une interface serie integrés ( sinon dommage d'utiliser ce pic !! ) , donc tu as besoin des + et - 12v qui ne sont pas sur le port parrallele . Autrement il y a bien sur des composants qui adaptes les signaux si tu veux passer par le port parallele . mais a mon avis il est plus simple de faire du 5v avec du +12 , que le contraire
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Je te conseil en effet d'utiliser la DLL de B. Kainka pour plusieurs raisons :
    - Compatible Windows 98 et XP.
    - Contrôle de "pratiquement" (pas la broche RXD) toutes les brôches du port série. La plus part des composants se basent sur le protocole RS232, tu ne peux donc pas faire ce que tu veux.
    - L'auteur de la DLL a une expérience en électronique et pourra répondre à tes questions. Il a écrit un livre "Les interfaces de mon PC sous Windows" avec Delphi et Visual Basic.

    Tutorial : http://delphipage.free.fr/portserie.html

    Cordialement.

  7. #7
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Yoann,

    c'est via ton tutoriel que j'ai téléchargé la dll. J'ai fait le tuto et ca fonctionne. Mais quand je veux envoyer un byte a mon PIC, ce dernier ne recoit rien. hors avec le terminal ca fonctionne. Le pic attend juste un byte en rs232.

  8. #8
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    En fait, quelqu'un pourrait-il simplement me dire comment je dois faire pour envoyer un byte au PIC ? Le résultat doit etre le meme que quand j'envoie qqch avec un terminal.

    SendByte n'a pas l'air de fonctionner (je ne comprends pas d'ailleurs). Quelle procédure dois-je utiliser ??

    Help

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Essaye d'utiliser la broche TXD :
    PS: Si tu n'y arrives pas, envois moi ton prog.

  10. #10
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Ca ne marche pas mieux.

    J'ai repris le code de l'exemple avec la led et je l'ai modifié un peu, donc quand je pousse sur connection, c'est sensé envoyé la valeur 5 au pic mais il ne réceptionne que dalle.

    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
    implementation
     
    {$R *.DFM}
     
    //Importe les procédures et les fonctions de la DLL que l'on a besoin
    function OPENCOM(OpenString:PChar):Integer; stdcall; external 'RSCOM.DLL';
    procedure CLOSECOM(); stdcall; external 'RSCOM.DLL';
    procedure TXD(d:WORD); stdcall; external 'RSCOM.DLL';
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    SortieClgn:=1; //Initialise la variable "SortieClgn"
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    OpenCom('COM4: baud=9600 parity=N data=8 stop=1'); //Ouvre et paramètre la connexion sur COM1
    {On peut également faire ceci : "OpenCom('COM1:9600,N,8,0');" mais la notation recommandée par l'auteur (Burkhard Kainka) de la DLL pour toutes les versions de Windows est la première}
    Timer1.Enabled:=True; //Active le timer
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    Timer1.Enabled:=False; //Désactive le timer
    Label1.Visible:=False; //Enlève le label
    TXD(5); //Envoi la valeur "0" vers la sortie pour que la LED soit allumée
    CloseCOM; //Libère le port
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    //Var i:integer;
    begin
    //Alterne les "0" est les "1"
    if SortieClgn=0 then
    SortieClgn:=1
    else
    SortieClgn:=0;
    //TXD(SortieClgn);
    Label1.Visible:=True; //Affiche le label
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    if Timer1.Enabled=True then //Si le Timer n'est pas arrêter alors on se déconnecte avant de quitter le programme
    Button2Click(Sender)
    end;
     
    end.
    Ce que je veux juste faire, c'est vraiment communiquer en RS-232 à l'image des commandes "serin" et "serout" en basic. J'ai essayé avec les composant TComPort mais j'arrive pas non plus.

    Je comprends pas ce que je dois faire.

    Quelqu'un pourrait-il me donner un exemple ?

    Balises CODE rajoutées par subØ

  11. #11
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Salut, pense a mettre ton code entre les balises code, il sera plus lisible.
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  12. #12
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Yo !

    Est-ce que ton problème ne viendrait pas simplement de la (non) gestion du contrôle de flux hardware ???
    Je pense aux signaux DTS, RTS, CTS et DTR.

    Si cela fonctionne à partir d'un terminal, je te conseille de vérifier l'état de ces signaux lorsque ton terminal est connecté. Ensuite, tu fais en sorte que ton logiciel les positionne identiquement avant d'envoyer ton byte.

  13. #13
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    ok je vais regarder. Mais comment je peux avoir accès à ces signaux ? Via le terminal ? Ou bien dois-je utiliser un voltmètre ?

    Merci pour les précisions

  14. #14
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    743
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 743
    Points : 500
    Points
    500
    Par défaut
    Avec un voltmetre tu ne verra rien , les signaux sont pas tous statiques donc trop rapide pour un voltmetre.
    je te conseille d'utiliser un de ces petit conecteur equipé de led qui s'insere en serie avec ton port de communication et qui visualise les signaux de la rs232 .
    Par contre as tu deja fait tourner ton petit programme dans le pic en autonome pour etre que que c'est pas de chez lui que viens ton probleme , le port du pic est il bien initialiser ...
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  15. #15
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Pour apporter encore une petite précision : entre le pic et le connecteur j'ai un circuit HIN232CP. Je sais pas si ca change qqch au probleme mais comme ca je le signale.

    J'ai fait tourner le programme sur le pic et j'ai envoyé un byte par le terminal. C'est ca que tu entends par "en autonome" ou tu penses a autre chose ??? Merci de m'éclairer

  16. #16
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par petitcoucou31
    Avec un voltmetre tu ne verra rien , les signaux sont pas tous statiques donc trop rapide pour un voltmetre.
    Si, c'est jouable avec un voltmètre. Il faut connaitre les états stables de ces signaux une fois le terminal connecté. Donc un voltmètre peut remplacer une jonction éclatée.

  17. #17
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Ok je vais tenter avec un voltmètre.

    Autre chose, concernant le flow control, si je travaille en 'flow control : none' , je ne dois me soucier que de Tx et Rx non ?

  18. #18
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Ce n'est pas si simple que ça. Ca dépend également de la conf de l'UART du PIC. L'idéal est réellement de recopier la conf d'une solution qui fonctionne : Le terminal.

    Pour info, sur une jonction V24 :
    - état 1 (SET) : -12v
    - état 0 (RESET) : +5v

    Pour le brochage, tu peux jeter un coup d'oeil ici : http://mgc99.free.fr/Lserie.htm

  19. #19
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Bon, sur le connecteur qui est sur ma carte avec le PIC, je mesure, et ce, que le terminal soit connecté ou pas :

    Broche 1 : CD : 0 V
    Broche 2 : RD : -7.62 V
    Broche 3 : TD : -7.62 V
    Broche 4 : DTR : -8.41 V
    Broche 5 : GND : 0 V (encore heureux )
    Broche 6 : DSR : 0 V
    Broche 7 : RTS : 0 V
    Broche 8 : CTS : -8 V
    Broche 9 : RTS : 0 V

    Ca correspond pas aux valeurs dont tu parles mais ce qui m'intrigue le plus c la différence entre les différentes broches négatives. Soit.

    J'ai donc vite fait le petit prog Delphi tout bete suivant (en utilisant le composant TComPort):


    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
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ComPort1.Open;
    ComPort1.SetDTR(true);
    ComPort1.SetRTS(false);
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    ComPort1.WriteStr(Edit1.Text)
    end;
     
    end.
    Et j'ai constaté que quand j'appuie sur le bouton 1 qui ouvre le port et établit la connection, la seule différence est que la broche 2 RD est à + 7.62 V.

    C'est la seule différence avec le terminal. Ensuite si j'appuie sur le bouton 2 pour envoyer le byte, ca ne fonctionne pas. Avec le terminal bien. Que faire ?????

    Je sens qu'on est pas loin de la solution, mais je suis un peu dans le vent sur ce qui ne va pas.

  20. #20
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    743
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 743
    Points : 500
    Points
    500
    Par défaut
    Pour ce qui est du pavé HIN232CP il devrait pas y avoir de problemes c'est un transmetteur de ligne RS232 qui adapte les signaux , au cas ou ils y auraientt plusieurs port rs232 de connecter , en l'occurance ce pavé possede deux port serie . et en plus qui ne necessite que d'une alimentation 5v.

    Quand je parte d'autonome : un pic a deux utilisation , soit de faire une tache "complexe" et d'envoyer les resultats de son operation au pc , soit de fonctionner en autonome , a la mise sous tension il gere tout le processus a executer ( sans pc.. ).

    je te demandais cela pour etre sur que le programme que tu as dans le pic soit fonctionnel , mais il semble que oui , puisque il marche avec ton terminal .

    En fait c'est koi ton terminal , aussi un pc ? , une maquette qui pilote le pic ? ...
    quand tu fais ta manip tu change juste la prise du port serie , elle passe du terminal au pc , ou tu utilise un autre cordon ... ( çà semble bete que je dise çà mais des fois..!! )

    j'ai pas le datasheet de ton pavé ( HIN232Cp) sous la main pour l'instant
    ni meme du pic que tu utilise ( je suis en vacances ) , mais je doute que ce soit un probleme d'adaptation ..

    par contre une idée bete qui me passe par la tete !! ah tu essayé de faire dialoguer simplement ton programme delphi avec le terminal tout deux possede aussi des port serie !! et peut etre plus simple a visualiser le probleme que dans le pic ..
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

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

Discussions similaires

  1. Communication RS232 avec un PTS400-3
    Par Kartoon67 dans le forum LabVIEW
    Réponses: 17
    Dernier message: 11/03/2016, 13h16
  2. [WD15] communication RS232 avec une carte relais 8 canaux
    Par soufasoufa33 dans le forum WinDev
    Réponses: 9
    Dernier message: 25/10/2012, 04h41
  3. Réponses: 1
    Dernier message: 30/04/2009, 19h37

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