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

MFC Discussion :

Aide pour la prise en main du Protocole MODBUS/JBUS


Sujet :

MFC

  1. #1
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut Aide pour la prise en main du Protocole MODBUS/JBUS
    Bonjour,

    Voici le contexte, j'effectue un stage dans la supervision technique centralisée d'un groupe et l'une de mes taches est de vérifier si les informations transmises par les équipements sont cohérentes.
    Pour cela, je dois réaliser un soft qui jouera le rôle de maître et qui me permettra de communiquer par liaison série RS232 avec un TES.

    Remarque : Les TES convertissent leurs entrées( 32 par exemple), chaque broche correspondant à l'état d'un équipement, en mots qui sont « sérialisés » et dans l’autre sens, « désérialisent » les mots en provenance du maître pour commander les sorties.
    Le protocole de communication sérialisé utilisé est le Modbus/Jbus.

    J'ai commencé à faire des recherches et des questions me viennent en tête :
    A l'aide de fonction de lecture et d'écriture ( par ex : ReadFile,WriteFile ou SendData et ReadData de la classe CSerial pour ceux qui connaissent), je dois emettre le protocole JBUS sous forme de CString??
    Pour emettre des données à travers une liaison série, sont elles toujours de type char, cstring?
    PLusieurs classes sont disponiblibes sur codeguru, je n'arrive pas à avoir assez de recul pour le choix de la classe :
    CSerial qui me semble simple : http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c2503/
    CSerialPort : http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c5395
    Serial Communication in Windows : http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c5425/

    Merci si vous pouvez répondre à ces questions, ou m'expliquer, m'orienter.

    Bonne journée

    Nicolas

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    regarde ce post dans la faq et l'exemple qui va avec:
    http://c.developpez.com/faq/vc/?page...WithSerialPort

  3. #3
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut Re: Aide pour la prise en main du Protocole MODBUS/JBUS
    Bonjour,
    Citation Envoyé par homeostasie
    A l'aide de fonction de lecture et d'écriture ( par ex : ReadFile,WriteFile ou SendData et ReadData de la classe CSerial pour ceux qui connaissent), je dois emettre le protocole JBUS sous forme de CString??
    Pour emettre des données à travers une liaison série, sont elles toujours de type char, cstring?
    Les ports séries ont deux mode de fonctionnement : En mode texte ou en mode binaire. Les trames Modbus sont des suite d'octets protocolés, donc le mode binaire est mieux. Il te suffit d'avoir une tableau d'éléments "unsigned char" que tu envois par la RS232 via WriteFile.

    Pour les classes que tu proposes, je ne les connais pas, mais tu as aussi l'excellente classe de Farscape qui fonctionne très bien (sauf sur Embedded Visual C++). Bonne trames

  4. #4
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Je vous remercie pour ces conseils, je vais me plonger dedans...Je sens que je vais m'amuser hum hum
    Je ne mets pas tout de suite le post it résolu, on ne sait jamais ;o)

    Bonne journée

    Nicolas

  5. #5
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Voila je viens de lire en grande partie le code utilisé dans la classe de Farscape et j'ai quelques petites questions :

    1) Pour la fonction SetTimeouts qui permet de régler le temps ou la ligne est utilisé en émission et en réception, à quelle durée corresponds dwRxTimeout=5000? apparemment 5s? sur quoi est basé ce calcul?

    2) Pour la fonction : int ReadBuffer(char *buffer,unsigned int ucount), à quoi corresponds la variable ucount?

    3) Dans la fonction ReadBuffer(), que signifie les variables counttoread et countread?

    4) Dans la fonction WriteBuffer(), que représente comstat.cbOutQue dans la ligne amounttowrite = m_nOutputBufferSize - comstat.cbOutQue;

    5) J'utilise visual c++ 6.0, la classe devrait fonctionner?

    Merci d'avance si vous pouvez me répondre.

    Nicolas

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Citation Envoyé par homeostasie
    Voila je viens de lire en grande partie le code utilisé dans la classe de Farscape et j'ai quelques petites questions :

    1) Pour la fonction SetTimeouts qui permet de régler le temps ou la ligne est utilisé en émission et en réception, à quelle durée corresponds dwRxTimeout=5000? apparemment 5s? sur quoi est basé ce calcul?

    2) Pour la fonction : int ReadBuffer(char *buffer,unsigned int ucount), à quoi corresponds la variable ucount?

    3) Dans la fonction ReadBuffer(), que signifie les variables counttoread et countread?

    4) Dans la fonction WriteBuffer(), que représente comstat.cbOutQue dans la ligne amounttowrite = m_nOutputBufferSize - comstat.cbOutQue;

    5) J'utilise visual c++ 6.0, la classe devrait fonctionner?

    Merci d'avance si vous pouvez me répondre.

    Nicolas
    1)le temps est exprimé en ms ,aucun calcul c'est arbitraire ,
    tu n'est pas obligé d'appeler cette fonction par defaut le timeout est reglé sur 1s. ,
    // réglage du timeout sur la reception et l'émission
    // Note par défaut le reglage de la voie est a 1s.
    bool SetTimeouts(DWORD dwRxTimeout=5000,DWORD dwTxTimeout=5000);
    et puis c'est des valeurs par defaut de la fonction tu es libre de choisir ta valeur.

    2)
    // lecture d’une chaîne de caractères d’une taille donnée.
    // GetCountRead() contiendra la taille reellement lue .
    int ReadBuffer(char *buffer,unsigned int ucount);
    ucount= taille a lire .

    3)counttoread== octets a lire ,countread== octets lus.

    4)comstat.cbOutQue ==
    Citation Envoyé par MSDN
    cbOutQue
    Number of bytes of user data remaining to be transmitted for all write operations. This value will be zero for a nonoverlapped write.
    le nombre d'octets restant a transmettre.

    5) oui , le projet de test qui est joint est en VC6.0


  7. #7
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Bonjour,

    J'ai commençé à bien m'interesser la la fonction int ReadBuffer(char *buffer,unsigned int ucount) de la classe CCom de Farscape et j'aurais voulu avoir des petits renseignements la concernant.
    La variable ucount avertit le nombre de caractère que l'on désire lire.
    Si on ne connait pas à l'avance le nombre de caractères que l'on doit recevoir, la technique serait d'associer une grande valeur à ucount et de compter combien on a reçu de caractère avec la fonction : int GetCountRead(){return m_count;}?

    De plus je me demandais, fixe t'on le le temps de lecture grace au timeout? Une fois le timeout de récéption terminé, il n'est plus possible de lire les données sur la ligne? OU la fonction de lecture tente de lire le nombre exact de caractère fixé par ucount?

    Merci d'avance pour vos réponse

    Bonne journée

    Nicolas[/code]

  8. #8
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    En attendant d'éventuelles réponses sur les questions précédentes ;o), j'ai tenté de recevoir des données que j'ai émise par le port série.

    Voici comment je m'y suis pris :
    Sur le com 1, j'ai branché le rs232 et de l'autre coté du cable j'ai relié les broches Rx et Tx pour récupérer mes propres données.
    Mais voila, je n'arrive pas à les recevoir, plutot embetant.

    Mon code pour effectuer des essais :
    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
    	// Initialisation du port
    	m_Com.PortOpen(1,9600,'N',8,1); //N°port:Com1, Baudrate, Parité, Nb bits, Bit stop:oui 
    	//Trame à envoyer
    	strTrameEmise = "nicolasfzfghjghhhtrehfdjhrgsfjkgfjqsdsbfzqegrziueunbcvbehfirurezhchrhr";
    	//Envoie de la requête
    	if (!m_Com.WriteBuffer(strTrameEmise+"\0",0)) //longueur de chaine facultative si se termine par ‘\0
    		MessageBox("Erreur de transmission","Etat Trame",MB_OK);
     
    	//Fonction de récupération de la trame de réponse à la requête
    	char *szTrameRecue;
        	szTrameRecue = new char [20];
    	szTrameRecue = NULL;
    	m_Com.ReadBuffer(szTrameRecue,20);
     
    	int NbCaractLu;
    	NbCaractLu = m_Com.GetCountRead();
     
    	//la valeur 20 est aléatoire -> nécessite de faire un calcul sur le nb de mots à lire
    	//spécifié dans la trame de question
     
    	m_strTrameRecue = m_strTrameRecue + "\r\nTrame de réponse :"+ szTrameRecue;
    	GetDlgItem(IDC_EDIT_TrameRecue)->SetWindowText(m_strTrameRecue);
    Je me dis que peut être les données sont arrivées trop tôt ou trop tard par rapport à l'appel de la fonction ReadBuffer(szTrameRecue,20).
    Comment remédier à cela?
    Je me dis qu'il faudrait qu'un buffer récupère constamment ce qu'il y a sur le port série tant que et dès que le maître ne pose plus de questions.
    Si vous avez une solution...

    Merci

    Nicolas

  9. #9
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Citation Envoyé par homeostasie
    La variable ucount avertit le nombre de caractère que l'on désire lire.
    Si on ne connait pas à l'avance le nombre de caractères que l'on doit recevoir, la technique serait d'associer une grande valeur à ucount
    Tout dépend, car si la lecture est bloquante, tu ne sortiras pas de la fonction de lecture avant d'avoir lu ucount octets. Je ne me souviens plus si cette classe est synchrone ou asynchrone, ni si elle supporte les deux modes en paramértage.

    Ta solution ne marche que sur une com asynchrone... et encore, la gestion du beffer et l'attribution des trames va être cotton !

    Dans le protocole Modbus la longueur des trames est connue pourtant.

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    Pour la réception, je te conseille vivement de mettre en place un thread comme indiqué dans l'exemple de la FAQ. Personnellement, c'est ce que j'ai fait et cela fonctionne très bien. J'avais essayé en sans, mais c'est ingérable ; et pour peu qu'une trame n'arrive pas entière, ton appli est bloquée.
    Par rapport à la réception de trames de longueur non spécifiée auparavant, j'ai mis en place quelque chose de similaire : la longueur de la trame à lire est la valeur du premier octet reçu +1. Je ne connais pas le protocole Modbus, mais tu peux t'inspirer de ce que j'ai fait.
    De plus, les trames que je reçoit sont émises de façon asynchrone et n'arrivent pas forcément 'entières'.

    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
    LONG Controler::OnReceiveCom(WPARAM ch, LPARAM port)
    {
    	CCom *pCom=(CCom*)ch;
    	static char sizeOfFrame = 0;
    	unsigned char tmpTab[20];
    	char *p_tmpTab = (char*)tmpTab; // ReadBuffer method need 'char' type, others methods 'unsigned char' type
    	int bufferContent = pCom->SizeUsedInRXBuf(); // how many bytes in buffer ?
     
    	while(bufferContent!=0) {
    		if(sizeOfFrame==0) 
    			pCom->ReadBuffer((char*)(&sizeOfFrame),1); // lenght of the next frame to load
    		tmpTab[0] = sizeOfFrame; // length in the tab (needed for the frame decode process)
    		if(bufferContent >= sizeOfFrame) {
    			pCom->ReadBuffer(p_tmpTab+1, sizeOfFrame); // reading the end of the frame
     
    			// TRAITEMENT DE TA TRAME A FAIRE ICI : tmpTab contient une trame 'entière'
     
    			sizeOfFrame = 0;
    			bufferContent=pCom->SizeUsedInRXBuf(); // how many bytes left in buffer ?
    			}
    		else break;
    		}
    	return 0L;
    }
    En espérant que ça t'aide.

  11. #11
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Bien bien merci deja pour toutes ces informations.

    Pour ce qui est du bout de code que tu m'as fourni pour la réception, je l'ai lu et essayé mais j'ai plutot conservé le mien qui semble fonctionner maintenant, quoique j'ai un pb à régler.

    A propos du protocole JBUS en mode RTU, je dois envoyer ma trame octet par octet? C'est à dire 01 pour le num de l'esclave puis 03 pour le code fonction etc... OU constituté ma trame complète de cette forme : 01/03/00/00/00/32/C4/1F est envoyer directement cela sur la ligne.

    Je demande cela car dans une doc technique l'exemple de trame donnée est de la forme 01/03/00/00/00/32/C4/1F avec des '/', ainsi que la réponse.

    Dans le cas ou il faut envoyer octet par octet, si le numéro d'esclave est 10, dois je envoyer 0 puis A pour faire 0A ou 0A d'un coup ou tout simplement A?
    De plus pour envoyer une trame, il serait donc nécessaire de faire une boucle avec la fonction WriteBuffer à l'intérieur pour envoyer octet par octet alors et non une trame toute faite d'un coup??

    MErci si vous pouvez me répondre, car d'ici peu va falloir que je les envoie mes trames ;o)

    Bonne soirée

    Nicolas

  12. #12
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Bonjour,
    A part ton cahier des charges peut-être, ou des contraintes sur ton projet, rien ne t'oblige à envoyer les trames octet par octet.

    La bonne méthode consiste à mettre l'intégralité de la trame dans un buffer privé, que tu envoies sur la rs232 d'un bloc.

    La méthode WriteFile peut être bloquante dans ce cas, mais c'est alors au driver bas niveau d'assurer l'envoi correct de la trame.

    Bien sur, il te faut implémenter des timeout ... et prévoir le cas où toute la trame ne pourrait pas partir, car dans une com bloquante, ce cas signifie que le thread de traitement sera en "deadlock".

  13. #13
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Citation Envoyé par Caine
    Bonjour,
    A part ton cahier des charges peut-être, ou des contraintes sur ton projet, rien ne t'oblige à envoyer les trames octet par octet.

    La bonne méthode consiste à mettre l'intégralité de la trame dans un buffer privé, que tu envoies sur la rs232 d'un bloc.

    La méthode WriteFile peut être bloquante dans ce cas, mais c'est alors au driver bas niveau d'assurer l'envoi correct de la trame.

    Bien sur, il te faut implémenter des timeout ... et prévoir le cas où toute la trame ne pourrait pas partir, car dans une com bloquante, ce cas signifie que le thread de traitement sera en "deadlock".
    la classe de la faq est asynchrone ,de toute façon comme je l'ai déjà dis pas de com synchrone sous windows. (voir faq).
    les données peuvent ecrites d'un seul bloc il n'y aura pas de blocage.

  14. #14
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Effectivement, mais il peut aussi vouloir en faire une extension synchrone.

    Je ne me souvenais plus pour la classe.

    Au fait, bravo et merci d'avoir mis cette classe à disposition.

  15. #15
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Bonjour,

    Bien en fait je ne cherche pas à faire une extension synchrone, on va rester en asynchrone sourire.

    En fait, j'envoie sur la ligne une suite d'octets correspondant à une requete JBUS maître grâce à un buffer szTrameEmise de type char*.
    Voici ce qu'il contient :
    00422DC0 01 03 00 00 00 20 44 ..... D
    00422DC7 12
    En réception un problème semble se poser car le buffer szTrameRecue recoit seulement les 2 premiers octets 01 03.
    Apparemment des que le buffer de réception voit un zéro, il ne prends plus en compte les valeurs suivantes?
    Il y a t'il un moyen de remédier à cela? surement! En attendant vos suggestions, je vais m'y pencher.

    Merci encore et encore

    Nicolas

  16. #16
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Bien bien, je suis toujours confronté au même soucis, comment emettre la valeur binaire 0 à travers le buffer de type char*. En effet, si je pense avoir bien cerné, le caractère 0 signifie la fin de chaine et ceci cause un problème pour l'emission de ma trame.

    La trame a par exemple cette configuration :
    1(n°esclave) 3(type d'opération) FF00(adresse de départ) 0016(nb mots à lire) + CRC16(2octets)

    des que je mets la valeur 0 dans le buffer de l'addresse FF00, alors la valeur 0016 (2octets) et le crc ne sont pas émis alors que que j'ai enregistré ces valeurs dans le buffer.

    Si vous avez une idée pour outrepasser le pb, elle sera la bienvenue!
    Peut être dois je faire plutot un tableau d'entier à transmettre?!

    Merci

    Nicolas

  17. #17
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    voila je crois qu'avec la classe CCom de Farscape, il n'est pas possible d'émettre la valeur 0 par le port série et de la récupérer.

    Voici un bout de code ou j'émet la valeur 0 et pourtant en réception je n'ai rien, alors que pour tout autre valeur excepté 0, cela fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char* a = new char[1];
    	*(a) = 0x0;
    	if (!m_Com.WriteBuffer(a,0))
    		MessageBox("Erreur de transmission","Etat Port Série",MB_OK | MB_ICONWARNING);
    	else MessageBox("Trame émise","Etat Port Série",MB_OK);
    	delete [] a;
    Bien qu'en pensez vous? est ce normal? Comment pourrais je faire si je veux envoyer 2 octets avec le poids forts à 00 puis le poids faible 45 sachant que des que la fonction d'ecriture voit 0 dans le buffer alors il n'ecrit pas les autres valeurs qui se trouvent apres dans le buffer?

    Delicat délicat, je m'y prends p-e mal...

    Bonne soirée

    Nicolas

  18. #18
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    voila je crois qu'avec la classe CCom de Farscape, il n'est pas possible d'émettre la valeur 0 par le port série et de la récupérer.

    Voici un bout de code ou j'émet la valeur 0 et pourtant en réception je n'ai rien, alors que pour tout autre valeur excepté 0, cela fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char* a = new char[1];
    	*(a) = 0x0;
    	if (!m_Com.WriteBuffer(a,0))
    		MessageBox("Erreur de transmission","Etat Port Série",MB_OK | MB_ICONWARNING);
    	else MessageBox("Trame émise","Etat Port Série",MB_OK);
    	delete [] a;
    Bien qu'en pensez vous? est ce normal? Comment pourrais je faire si je veux envoyer 2 octets avec le poids forts à 00 puis le poids faible 45 sachant que des que la fonction d'ecriture voit 0 dans le buffer alors il n'ecrit pas les autres valeurs qui se trouvent apres dans le buffer?

    Delicat délicat, je m'y prends p-e mal...

    Bonne soirée

    Nicolas

  19. #19
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    c'est sur que si tu mets zero dans la longueur du buffer a emettre ça va pas le faire lol.
    pour envoyer un octet :if (!m_Com.WriteBuffer(a,1)) pas zéro

  20. #20
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    oui, ca fonctionne, en fait dans mon cas pour l'envoie d'une trame qui peut contenir la valeur 0, il était nécessaire de spécifier le nombre d'octets dans la trame. Me suis figé au niveau de la lecture alors que ca venait de la fonction d'écriture...;o)

    Merci en tout cas

    Bonne journée

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

Discussions similaires

  1. Fonction 4 du protocole MODBUS/JBUS
    Par clairetj dans le forum Débuter
    Réponses: 5
    Dernier message: 01/04/2014, 09h22
  2. Prise de main à distance pour windows CE 6
    Par Kentin dans le forum Windows Mobile
    Réponses: 0
    Dernier message: 30/11/2009, 15h22
  3. Aide pour le protocole de sécurité TLS
    Par jimmplan dans le forum MFC
    Réponses: 2
    Dernier message: 10/03/2009, 13h01
  4. Logiciel pour prise de main a distance
    Par wincroc dans le forum Windows
    Réponses: 15
    Dernier message: 30/12/2008, 15h40
  5. Prise en main de rose pour base de données
    Par locus dans le forum Rational
    Réponses: 2
    Dernier message: 05/09/2007, 16h52

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