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

C++Builder Discussion :

Pb sur TComPORT par rs232


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 17
    Par défaut Pb sur TComPORT par rs232
    Bonjour j ai de nouveau un probleme avec leTComport...


    En fait je relie le port COm a un telephone portable. Ce dernier m envoie une chaine de caractere . Si au bout d un certain temps je n ai pas repondu.. il me renvoit une autre ....

    J ai essayé de faire une boucle du genre:
    static boolean aquisition_com2_en_cours=false;

    if (aquisition_com2_en_cours==false)
    {
    aquisition_com2_en_cours=true;

    temps_com2_deb=toto.CurrentDateTime();
    temps_com2_fin= toto.CurrentDateTime();
    ReceptionCOM2_en_cours="";
    while ((temps_com2_fin-temps_com2_deb)*24*60*60*1000<300.0)
    {
    if (ComPort2->InputCount()>0)
    {
    ComPort2->ReadStr(temp,ComPort2->InputCount() );
    ReceptionCOM2_en_cours=ReceptionCOM2_en_cours+temp;
    temps_com2_deb=toto.CurrentDateTime();
    }

    temps_com2_fin= toto.CurrentDateTime();


    ou 300 correpondait je pensais au temps en ms sec .Cela marchotte.. mais je n ai pas a 100 % une trame complete sans coupure...


    En fait pour shematiser
    je penser que c etait un truc du genre:
    AA BB CC EE
    GG UU DD ZZ

    Entre AA et BB je partais de l hypothese que le temps etait tres petit et qu entre EE et GG plus long (300 ms)

    En fait je recois la trame sous la forme:

    AA BB CC EE GG
    UU DD ZZ

    En resumé je n arrive pas a detecer la fin dereception pour analuyser ma trame

    Quelqu un a des idees??
    J ai pensé a utilisé OnRxBuf... mais je ne sais pas comment faire il me dit property not compatible.....


    merci

  2. #2
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Salut,
    Sur ce composant il existe l'evennement OnRxChar, qui se lance dès la réception d'un caractère sur le port COM.
    Cet évènement te donne un char* contenant les octets recu, et Count, le nombre d'octet dans cette chaine.
    C'est peut être plus simple pour toi d'utiliser cet évènnement.

    Sinon, ta fonction pourrait être utilisé dans un thread pour scruter en permanance le port COM, mais je te conseil l'évennement donné.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 17
    Par défaut
    salut bandy.....
    le code que tu vois ci-dessosu est mis ds la fonction que tu m as dit
    void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count)
    {
    AnsiString Phrase2;
    AnsiString Recu,temp,reception_com1;


    mais ca marche pas..... j arrive pas a detecter une trame d une autre.. c est pour ca que j ai essayé de me basé sur les tempo.....entre deux trames..

  4. #4
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Ton protocole de communication n'intègre pas un début de trame, une fin de trame ou alors une longueur ? Voir un checksum pour une vérification de données ?

    Si tu connais ton protocole, il doit avoir moyen de faire la différence entre 2 trames.

    Ton problème est que tes trames ne sont jamais complète, c'est bien ca ? Ce n'est pas un problème hardware?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 17
    Par défaut
    non je ne connais pas le protocole en complet pour l instant vu que je suis obligé d espiopnner et de voir ce qui arrive... conclusion je suis bloqué entre 2 trames.
    La seule info est que j ai et le temps. Entre deux trames j ai un temps donné tres petit...

  6. #6
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Si tu es sur que tu tombes entre 2 trames (tu doit donc connaître un minimum de choses sur ce protocol donc) et que ton problème est le Temps, je ne te conseil pas d'utiliser le TComPort, mais d'utiliser les API Windows et de faire un thread.

    Avec cette solution, tu ne pourra pas aller plus vite que Windows sur ton PC en fonction de ton code.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 17
    Par défaut
    je suis sur de tomber entre duex trames car je recois deux fois la meme trame car avec la seconde trame coupé en 2.
    je suis interesse par tout ce qui est API windows comme tu le dis mais je ne sais pas du tout comment on le fait..et encore moins faire un thread...

    merci pour tout encore

  8. #8
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Alors, on va commencer par le thread, tu devrais trouver tout sur le site dans la FAQ ou dans l'aide de la fonction _beginthread de Builder.

    Pour ce qui est API Windows MSDN (en anglais) est un très bon site (il vaut mieux ) mais il te faudra en gros utiliser la fonction CreateFile et dialoguer avec lui par son Handle.
    Recherche du côté de SetCommState, avec les variables DCB je pense que tu devrais trouver ton bonheur.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 17
    Par défaut
    désolé de vous embeter encore.. mais je n y arrive decidemment pas.....

    si quelqu un de sympa pouvait me faire sous borland c++ un programme qui lit ce qui arrive sous le com et l affiche ds un memo avec un thread ca serait sympa.....sans utiliser le tcomport qui est trop lent pour moi....

    desolé d etre lourd.. mais ca marche pas che zmoi.


    Merci

  10. #10
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Tu peux tutoyer, y'a pas de soucis
    Voilà une petite fonction permettant l'ouverture du port COM:
    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
     
    HANDLE comHandle;
    DCB dcb;
    COMMTIMEOUTS timeouts;
     
    boolean OpenComPort(char comportname[4], uint comspeed)
    {
    	boolean success;
     
    	// Open the COM port
    	comHandle = CreateFile(comportname, GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    	if (comHandle == INVALID_HANDLE_VALUE) return(false);
     
    	// Get the current settings of the COMM port
    	success = GetCommState(comHandle, &dcb);
    	if (!success) return(false);
     
        // Modify the baud rate, etc.
    	dcb.BaudRate = comspeed;
    	dcb.ByteSize = 8;
    	dcb.Parity = NOPARITY;
    	dcb.StopBits = ONESTOPBIT;
            dcb.fOutxCtsFlow = FALSE;
            dcb.fOutxDsrFlow = FALSE;
            dcb.fDtrControl = DTR_CONTROL_DISABLE;
            dcb.fRtsControl = RTS_CONTROL_DISABLE;
            dcb.fAbortOnError = 0;
     
    	// Apply the new comm port settings
    	success = SetCommState(comHandle, &dcb);
    	if (!success) return(false);
     
    	// Change the ReadIntervalTimeout so that
    	// ReadFile will return immediately. See
    	// help file
    	timeouts.ReadIntervalTimeout = MAXDWORD;
    	timeouts.ReadTotalTimeoutMultiplier = 0;
    	timeouts.ReadTotalTimeoutConstant = 0;
    	timeouts.WriteTotalTimeoutMultiplier = 0;
    	timeouts.WriteTotalTimeoutConstant = 0;
    	SetCommTimeouts( comHandle, &timeouts );
     
    	// Set the Data Terminal Ready line
      	EscapeCommFunction(comHandle, SETDTR);
            PurgeComm(comHandle, PURGE_RXCLEAR);
    	return(true);
    }
    Avec ca, tu passes le port COM (expl "COM1") et sa vitesse (expl 230400) et les variables déclarées en global te donne accès au port COM.
    Ensuite tu lies sur le port COM avec la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DWORD Count;
    char Str[1024];
    ReadFile(comHandle, Str, 1024, &Count, 0)
    Tu lis 1024 octets au max sur le COM via son comHandle et tu stock les Count octets lues dans Str

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 17
    Par défaut
    merci beaucoup.. je teste ca demain...... si c est ok je met un resolu et je te remercie d avances.. ce forum est sympa.. c est pratique de trouver des gens qui s y connaissent pour aider les debutants......


    un grand merci a toi!!!!

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 17
    Par défaut
    une derniere question avant que je teste...

    avant de faire la commande ReadFile(comHandle, Str, 1024, &Count, 0), j ai un moyen de savoir si j ai des donnees a lire??


    le thread on le fait comment.... ce que tu me montre permet de lire le com sans thread non???

  13. #13
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Il n'y a aucun moyen de savoir s'il y a des données à lire, sinon de lire et si Count = 0 c'est qu'il n'y en avait pas.

    Pour le thread, tu voix ca dans la FAQ et tu utilises la class TThread ou tu utilise la fonction _beginthread dont tu trouveras des indication dans l'aide de Builder ou sur ce site.

Discussions similaires

  1. Pointeur sur NULL par défaut en parametre.
    Par KernelControl dans le forum Débuter
    Réponses: 3
    Dernier message: 15/12/2005, 10h09
  2. lire les données sur un port RS232
    Par xave dans le forum Langage
    Réponses: 6
    Dernier message: 06/10/2005, 16h40
  3. Programmer un automate par RS232
    Par wael khalil dans le forum Langage
    Réponses: 6
    Dernier message: 25/08/2005, 16h02
  4. liste déroulante. positionnement sur valeur par défaut
    Par mathieu_r dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 28/06/2005, 15h45
  5. Imprimer une dans un ".bat" sur Imp. par défaut (M
    Par argoet dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 19/11/2004, 09h53

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