C++ communication avec port COM

Fermé
seign Messages postés 11 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 19 mars 2007 - 27 févr. 2007 à 03:52
 Tatuty - 3 mai 2010 à 20:52
Bonjour tout le monde,
aidez moi s'il vous plait et si vous avez le temps, je vais craquer.
Alorss voila, je veux communiquer avec un analyseur de spectre branche sur le COM1.
J'ai reussi a taper un petit programme. J'arrive a lui envoyer des informations ( par exemple a changer la langue de l'analyseur en envoyant les bits 16 puis 3)
Jusque la tout va bien. Mais le probleme est que je n'arrive pas du tout a lire les infos qu'il m'envoie.
Quand il faut qu'il m'envoie des series de BYTE, j'ai rien du tout.
Je vous donne un exemple :
Pour avoir l'etat de sa batterie, je dois envoyer le BYTE 78, puis le BYTE 3. il devrait me renvoyer 5 BYTE normalement, mais j'ai rien :'(.
Voila mon programme : (je code avec C++Borland 6.0)

//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <windows.h>
#include <windef.h>
#include <stdlib.h>
#include <iostream.h>
#include <fstream.h>


#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main()
{

HANDLE handle;
DCB dcb;
COMMTIMEOUTS timeouts={0};
BOOL fSuccess;


unsigned long nBytesRead;
int NbOctet;

char c;
int i;
BOOL bResult,PortReady;

char buf2[1024];
DWORD nblu,nbecrit;

int aenvoyer2,aenvoyer3;



/*--------------------------------------------------------------------*/
/* Ouverture du port de communication pour l'ANALYSEUR DE SPECTRE */
/*--------------------------------------------------------------------*/


handle = CreateFile(
"COM1",
GENERIC_READ | GENERIC_WRITE , // acces pour lire et ecrire sur le port
0,
NULL,
OPEN_EXISTING,
0,
NULL
) ;


if(handle == INVALID_HANDLE_VALUE)
{
printf("Impossible d'ouvrir le port (erreur %d)\n", GetLastError());
return 0;
}


PortReady=SetupComm(handle,5000,5000);
fSuccess = GetCommState(handle, &dcb);

if (!fSuccess)
{
printf("probleme 1");

getchar();
}



dcb.BaudRate = CBR_9600 ;
dcb.ByteSize =8 ;
dcb.Parity=NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fNull=FALSE;
dcb.fRtsControl=RTS_CONTROL_ENABLE;
dcb.fInX=FALSE;
dcb.fOutX=FALSE;
dcb.fDtrControl=DTR_CONTROL_ENABLE;


PortReady=SetCommState(handle,&dcb);

if(!SetCommState(handle,&dcb))
{
printf("probleme 1");
getchar();

}





/*-----------------------------------------------------------*/
/* Les timeouts */
/*-----------------------------------------------------------*/

timeouts.ReadIntervalTimeout=50;
timeouts.ReadTotalTimeoutMultiplier=8;
timeouts.ReadTotalTimeoutConstant=8;
timeouts.WriteTotalTimeoutMultiplier=8;
timeouts.WriteTotalTimeoutConstant=8;


SetCommTimeouts(handle,&timeouts);
if(!SetCommTimeouts(handle,&timeouts))
{
printf("Impossible d'initialiser les timeouts (erreur %d)\n", GetLastError());
return 0;
}
/*-----------------------------------------------------------*/
/* envoi de donnees et reception */
/*-----------------------------------------------------------*/

aenvoyer2=78;
aenvoyer3=3;

WriteFile(handle,&aenvoyer2,1,&nbecrit,NULL);
WriteFile(handle,&aenvoyer3,1,&nbecrit,NULL);

ReadFile(handle,buf2,13,&nblu,NULL);

printf("\n char2= %s \n ",buf2);

getchar();

CloseHandle(handle);


return(fSuccess);
}
//---------------------------------------------------------------------------

12 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
27 févr. 2007 à 13:14
Salut.
Déjà un petit commentaire sur tes test : tu met "problème 1" à chaque fois, c'est pas très judicieu, tu devrais mettre "prolbème 1" puis "problème 2" etc.
Je n'ai pas la solution à ton problème, mais j'ai deux ou trois piste:
tu ne laisse pas le temps à ton analyseur de répondre, essai de mettre un sleep avant le readfile.
En général, ce genre de communication (readfile, writefile) fonctionnent par le biais d'un tampon. Tant que le tampon n'a pas atteint une certaine taille, il n'est pas envoyer. En C++ standard, tu as fflush() pour forcer le vidage d'un tampon.
Sinon, essai d'autre commande, peu être que la réponse pour la batterie est bugguer ou je ne sais quoi. Tu as peut être un ping ou un echo.
1
seign Messages postés 11 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 19 mars 2007
28 févr. 2007 à 03:14
merci beaucoup de m'avoir repondu.
Oui c'est vrai que mes "probleme !" sont pas super jolis, mais vus que je n'est pas eu de problemes, je ne m'en suis pas trop occupe.
Sinon j'ai essaye tout ce que tu m'as conseille, mais toujours rien. Je suis au bord de la crise de nerf :(
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
28 févr. 2007 à 09:01
Bon, il faut prendre le problème dans l'ordre...
selon ce que tu m'as dit, tu arrive à envoyer des données, qui sont corectement recptionner et traiter par l'analyseur de spectre (changement de langue).
donc a priori, il n'y a pas de raison que ta demande de niveau batterie ne soit pas reçu et traité. Pour érif, met le changement de langue dans ce programme là.
Si la langue est bien modifier, ce n'est pas un problème de flush sur le write(d'ailleur, tu dit que tu as essayer, mais quel fonction pour vider le tampon?) .
Pourquoi le 13 dans ReadFile ? j'aurai mi 5.
quelle valeur retourne le readFile? souvent il retourne le nombre d'octet reçu, ce qui peut être interessant pour le debug.
Tu peut essayer une boucle infini genre :
While(ReadFile==0){
Envoie de demande de batterie
reception du niveau
attente de 10ms
}fin while
Dernière idée : peut être la reception de donnée est-elle mal initialisé.
0
seign Messages postés 11 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 19 mars 2007
1 mars 2007 à 05:39
merci beaucoup. Maintenant j'arrive a recevoir des donnees. Par exemple, j'envoie le BYTE 13 pour recevoir les infos de la courbes. Normalement je dois recevoir 1950 Bytes. Je fais un affichage de ce qu'il me retourne, avec un printf, mais il me donne que les 40 premiers Byte ( date heure, nom de l'enregistrement).
Quand je fais un affichage avec :
hStdout=GetStdHandle(STD_OUTPUT_HANDLE);
WriteFile(hStdout,buf2,1960,&nbecrit,NULL);
Je vois qu'il y a bien 1950 caractere, mais apres le 40ieme caractere, il y a 4 espace et les caracteres suivant sont vraiment bizarres ( comme du martiens ou qqchose comme ca^^). Je redonne mon script si vous avez une idee :

#include <vcl.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <windef.h>
#include <stdlib.h>
#include <time.h>



#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main()
{

HANDLE handle,hStdout;
DCB dcb;
COMMTIMEOUTS timeouts={0};
BOOL fSuccess;


unsigned long nBytesRead;
int NbOctet;
int SortieRemoteMode=255;

char c;
int i,Indice;
BOOL bResult,PortReady;




char *buf2[2000]={0};

DWORD nblu,nbecrit;

int aenvoyer2,;


hStdout=GetStdHandle(STD_OUTPUT_HANDLE);


/*--------------------------------------------------------------------*/
/* Ouverture du port de communication pour l'ANALYSEUR DE SPECTRE */
/*--------------------------------------------------------------------*/


handle = CreateFile(
"COM1",
GENERIC_READ | GENERIC_WRITE , // acces pour lire et ecrire sur le port
0,
NULL,
OPEN_EXISTING,
0,
NULL
) ;


/*-----------------------------------------------------------*/
/* Verifier si handle ouvert correctement */
/*-----------------------------------------------------------*/


if(handle == INVALID_HANDLE_VALUE)
{
printf("Impossible d'ouvrir le port (erreur %d)\n", GetLastError());
return 0;


}


/*-----------------------------------------------------------*/
/* Ajustement des parametres */
/*-----------------------------------------------------------*/
/* On prend les valeurs de configuration initiale*/

PortReady=SetupComm(handle,5000,5000);


fSuccess = GetCommState(handle, &dcb);

if (!fSuccess)
{
printf("probleme 2");

getchar();
}



dcb.BaudRate = CBR_9600 ; /* vitesse */
dcb.ByteSize =8 ; /* nombre de bits */
dcb.Parity=NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fNull=FALSE;
dcb.fRtsControl=RTS_CONTROL_DISABLE;
dcb.fInX=FALSE;
dcb.fOutX=FALSE;
dcb.fDtrControl=DTR_CONTROL_DISABLE;


/*-----------------------------------------------------------*/
/* on applique les changements au port COM1 */
/*-----------------------------------------------------------*/
PortReady=SetCommState(handle,&dcb);

if(!SetCommState(handle,&dcb))
{
printf("probleme 3");
getchar();

}





/*-----------------------------------------------------------*/
/* Les timeouts */
/*-----------------------------------------------------------*/

timeouts.ReadIntervalTimeout=500;
timeouts.ReadTotalTimeoutMultiplier=550;
timeouts.ReadTotalTimeoutConstant=550;
timeouts.WriteTotalTimeoutMultiplier=550;
timeouts.WriteTotalTimeoutConstant=550;

/* On applique ces changements au port COM1*/
SetCommTimeouts(handle,&timeouts);
if(!SetCommTimeouts(handle,&timeouts))
{
printf("Impossible d'initialiser les timeouts (erreur %d)\n", GetLastError());
return 0;
}





aenvoyer=13;



WriteFile(handle,&aenvoyer,1,&nbecrit,NULL);
ReadFile(handle,&buf2,1960,&nblu,NULL);

printf("\n char2= %s \n ",&buf2[1]);

WriteFile(hStdout,buf2,1960,&nbecrit,NULL);


WriteFile(handle,&SortieRemoteMode,1,&nbecrit,NULL);



CloseHandle(handle);
CloseHandle(hStdout);


return(fSuccess);
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
1 mars 2007 à 08:57
je ne connait pas ReadFile et WriteFile, mais je suppose que le fonctionnement doit être proche de cin et cout.
lorsqu'on fait cin>>var1; l'entrée au clavier contient des espaces, seul la partie avant le premier espace sera affecter à var1.
Pour contourner le problème, il y a une option qui dit à cin d'ignorer les espaces comme marqueur de séparation. du genre cin.setflag("nblksp");
Je suppose qu'il doit exister une fonction/option similaire pour readfile.
Sinon, au lieu d'ouvrir ton port en char, il faut l'ouvrir en binaire .
0
seign Messages postés 11 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 19 mars 2007
7 mars 2007 à 05:49
bonjour et merci ,
j'ai toujours pas resolu mon probleme, j'ai une petite idee mais je sais pas comment la coder en C++.
Je recois le bon nombre de bytes que l'analyseur de spectre m'envoie, mais ils sont imcomprehensibles. Il les envoie sous forme de BYTE. Je voudrais donc les recevoir sous forme de BYTE et les mettre dans un fichier, mais je sais pas comment faire. Meme en declarant :

BYTE *buf2[2000]={0}; et en faisant :
ReadFile(handle,&buf2,1960,&nblu,NULL);
WriteFile(hStdout,buf2,1960,&nbecrit,NULL);

ca ne marche pas
On m'a dit d'utiliser la fonction fprintf pour faire la conversion en 0xFF , mais je suis pas sur.
Avez vous une idee ? Merci beaucoup

Revoici mon programme :

//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <windef.h>
#include <stdlib.h>





#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main()
{

HANDLE handle,hStdout,handle_FILE_TEXT;
DCB dcb;
COMMTIMEOUTS timeouts={0};
BOOL fSuccess;
int ExitRemoteMode=255;
int EnterRemoteModeNow=70;
BOOL bResult,PortReady;

BYTE*buf2[2000]={0};
DWORD nblu,nbecrit;

int tosend2,tosend1;





/*--------------------------------------------------------------------*/
/* Ouverture du port de communication pour l'ANALYSEUR DE SPECTRE */
/*--------------------------------------------------------------------*/
hStdout=GetStdHandle(STD_OUTPUT_HANDLE);



handle_FILE_TEXT = CreateFile(
"c:\\\\TEST.txt",
GENERIC_WRITE | GENERIC_READ,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_SYSTEM,
NULL
) ;
if(handle_FILE_TEXT == INVALID_HANDLE_VALUE)
{
printf("Impossible to open the port (error %d)\n", GetLastError());
return 0;

getchar();
}



handle = CreateFile(
"COM1",
GENERIC_READ | GENERIC_WRITE ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
) ;


/*-----------------------------------------------------------*/
/* Verifier si handle ouvert correctement */
/*-----------------------------------------------------------*/


if(handle == INVALID_HANDLE_VALUE)
{
printf("Impossible to open the port (error %d)\n", GetLastError());
return 0;


}


/*-----------------------------------------------------------*/
/* Ajustement des parametres */
/*-----------------------------------------------------------*/


PortReady=SetupComm(handle,5000,5000);
fSuccess = GetCommState(handle, &dcb);

if (!fSuccess)
{
printf("problem 1");

getchar();
}



dcb.BaudRate = CBR_9600 ; /* speed */
dcb.ByteSize =8 ;
dcb.Parity=NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fNull=FALSE;
dcb.fRtsControl=RTS_CONTROL_DISABLE;
dcb.fInX=FALSE;
dcb.fOutX=FALSE;
dcb.fDtrControl=DTR_CONTROL_DISABLE;



PortReady=SetCommState(handle,&dcb);

if(!SetCommState(handle,&dcb))
{
printf("problem 2");
getchar();

}





/*-----------------------------------------------------------*/
/* Les timeouts */
/*-----------------------------------------------------------*/

timeouts.ReadIntervalTimeout=500;
timeouts.ReadTotalTimeoutMultiplier=550;
timeouts.ReadTotalTimeoutConstant=550;
timeouts.WriteTotalTimeoutMultiplier=550;
timeouts.WriteTotalTimeoutConstant=550;


SetCommTimeouts(handle,&timeouts);


if(!SetCommTimeouts(handle,&timeouts))
{
printf("Problem for timeouts (erreur %d)\n", GetLastError());
return 0;
}




/*-----------------------------------------------------------*/
/* reception de donnees */
/*-----------------------------------------------------------*/

tosend1=17;
tosend2=0;






/* je dois lui envoyer une serie de byte pour lui dire de m'envoyer les !)% BYTE qui m'enteressent */

WriteFile(handle,&EnterRemoteModeNow,1,&nbecrit,NULL);
WriteFile(handle,&tosend1,1,&nbecrit,NULL);
WriteFile(handle,&tosend2,1,&nbecrit,NULL);


/*Receive Data from the spectrum analyser*/
ReadFile(handle,&buf2,1998,&nblu,NULL);




/*Write to the screen*/
WriteFile(hStdout,buf2,1998,&nbecrit,NULL);


/* save in TEXT.txt what the spectrum analyser has sent*/
WriteFile(handle_FILE_TEXT,buf2,1998,&nbecrit,NULL);


WriteFile(handle,&ExitRemoteMode,1,&nbecrit,NULL);


CloseHandle(handle_FILE_TEXT);
CloseHandle(handle);
CloseHandle(hStdout);
getchar();

return(fSuccess);
}
//---------------------------------------------------------------------------



et voila ce que je recois:
 оノテ€ ・ ォ?
ヤ '・・・・・ ー #( ー#x~ ー#x~ ーGG・ ーGG・ ーk ーk ー朱 ー朱 ーイミ^ ー #( ー#x~ ー#x~ ーGG・ ーGG・ ーk ーk ー朱 ー朱 ーイミ^ ー u0 ・ c  2ネNone ー ゥ* 0 鰆 ・ ・ 赳  茴 鵈 諤  ・ ロフ 綛 豢 ・ 璧 牴 纔 絮 褸 ・ ・ ヨ, ・ ル ラャ ユ@ ・ 赶 罟 弴 籤 ン ゚タ 磑 ルク 籵 笨 ヤワ ゙P マワ 謖 跖 ユ| ・ ヨ レ ・ ロ リt ・ ユ 雕 ゚ ミ ヨx ヘ0 ・ ホシ ゙ ゙ 犇 レエ ・ レ< ハエ モ4 ラャ ミ` ゙4 リ ホX ワミ ワミ 濾 ・ ユ@ ワL ゙ー ラミ ・ ミp ヘ レネ ロ< ン モ、 ン レト ユ` ゚ ユー ン, ン ラ ヨ< ユ ミ8 レt ラ, メ€ ン ヘタ ヒ リャ ミ ロ ヨh ルp 菎 ン メ$ 犇 レ ン` レ、 ノト ンp 饅 リt ワ ユエ ユL モ モ ワ ラX ハ ムl ユ ロ( ルX モ 罧 ユ@ ゚( ゙ ヨp レ, ヨャ マ ロL マ< ロp  レL ワ` レ ホD 猜 ラ ヒク ミヤ ルヤ ゙ヤ ゙ ヨ$ タ 网 ヨ ホ( ン ヤd ワ\ ロ ゚ ル ミフ ナ モ@ ミ マ| レd ロ< ロ ユタ 猜 フp レ ンネ ミ€ ホ ム ヌ€ リ ・ ムx モ ヘャ ゙ リ ナト ヨ レp ユ マ@ マl サp ハ ヤリ レP ム ロタ ラ@ ヨH ヒ ヤ` ヤL ム` ラ レ` ヘ8 ゚ マ< ラ ヨ\ ワ4 ・ フt ラx メィ ハ ル| ム ムャ モ ワ ヤP ニシ フエ ロ ラ, ロ$ ヤク フ ラP リ ヒ トー  レ8 レ リt ンリ リ ハ リ ハ4 レ ゚ ヨl ワ\ ホ ・ ハ ユク ラ マ< ラ、 レシ ミ ヤ タh ノ ヘx ミL メ ・ モl ヌt リク ヒx ミ ルh リヤ ムィ ミp 瀾 螟 ム ヨ マP ム0 ラ リィ モH ンT ラ ヤH ムャ ル ユ\ ネ ン\ リ ヤ 罧 レ、 メp リク ユミ リ` ・ フワ メ ミリ メh ラ0 ユシ 蚪 マL メ ミ ・ レ ム ・ ヤ ユ レH マ< マ ヨ( ム ミ、 ツ 皃 ヤd 篶 ネ、 ホX ゚ ンワ マX ヤ ゙ク 畊 ヨト ルl ハd リ ゚D フh ミx リ ムエ ミ ムィ ム ヨク ルX ゙8 ノL ム レ レ レ マ ヨL ホp ラ8 ユt ヤ リフ ル ラィ モ ゙ ヨ ン\ ミ ミフ ナ€ ゚ ン ロ ヨ ワx ロト モト リ ユ ヒフ 酳 ムエ ミ ム0 ナh ヒ ムエ ヒ、 ユ@ トT ヨ< ムX ラ ルエ ン< メ レ モ0
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
7 mars 2007 à 17:16
Salut.
Sans conviction, essai :
WriteFile(hStdout,(int*)buf2,1998,&nbecrit,NULL);
decidement, j'aime pas toute cette écriture MS !
C'est quoi 'BYTE" ? ça taille.
Les caractère que tu écri comporte des symboles asiatiques. Je suppose qu'il interprete donc ton buf2 comme de l'unicode, c'est à dire un nombre important de bits par caractère, et ça m'étonne que l'analyseur de spectre utilise un tel codage.
j'ai aussi un doute sur l'utilisation de ReadFile et WriteFile.
Je te conseil de faire un test de readfile sur un fichier, tu lis ce qu'il y a dedans et tu essai de voir si tu affiche bien.
Parceque là, aux problèmes de programmation, on ajoute les problèmes de matériel...
0
seign Messages postés 11 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 19 mars 2007
8 mars 2007 à 08:06
bonjour,
alors j'ai resolu mon probleme , j'ai fait :

//on met dans le buffer
ReadFile(handle,&buf2,1998,&nblu,NULL);


// et on envoie dans le fichier texte
for (q=0; q<2000;q++)
{

os << hex << setw(2) << static_cast< int >(buf2[q]);

}

comme ca , ca marche, je recois par exemple:
32124 0 320a4 0 321 8 0 32234 0 32068 0 324e8 0 32064 0 32198 0 31fcc 0 324d8

et ca correspond bien a ce que je veux, des suite de nombres en hexadecimal que je convertis en decimal apres.
Mais comme il y a toujours des probleme, il y a des trou dans certains paquets. Le pre;ier paquet est 32124 , le second 320a4 , mais pour le troisieme il y a un trou -->>321 8 . Du coup pour ecrire un programme qui converti les paquet, c'est un peu galere, car ca decale tout .
Je sais pas tro pcomment faire. Vous connaissez pas une fonction qui met des 0 a la place des espace dans les fichiers texte ??
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
8 mars 2007 à 11:52
C'était bien un problème de type comme j'ai dit alors. ça touche au but ton truc.
une fonction qui met des zéro à la place des espaces, je connait pas, mais c'est enfantin à créer.
J'ai pas compris ton histoire de trous... il manque un 0 entre 321 et 8, c'est ça?
0
seign Messages postés 11 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 19 mars 2007
9 mars 2007 à 01:51
32124 0 320a4 0 321 8 0 32234 0 32068 0 324e8 0 32064 0 32198 0 31fcc 0 324d8

oui, entre le 321 et le 8 il devrait y avoir un nombre ( ou a b c d e f ), car ca doit etre par paquet de 5, comme 320a4.
En plus je devrais recevoir que des paquet de 5 nombre hexa. Hors la, il m'envoie un paquet de %, puis un 0, puis un paquet de 5 nombre hexa, puis un 0 etc... Sans compter les trou dans certain paquet de % comme je l'ai dit avant.
Ca vient peut etre de ma fonction readfile sur COM1. Doit y avoir un probleme. Pour le vitesse de lecture, je suis sur que c'est du 9600 bauds, donc ca doit pas venir de la.
C'est quoi les fonction avec les stream pour lire directement sur COM1, un truc du genre buf2 << COM1;

Merci beaucoup :)
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
9 mars 2007 à 10:42
?
qu'est-ce qui te dit que 321 n'est pas entier ?
si tu as 00321, il n'affiche pas les zéros en début d'écriture !
Pour lire, c'est plutot COM1>>buf2. (stream>>variable)
je sais pas sur le com à quelle niveau est le traitement d'erreur.
En reseau IP, c'est traiter par la sous couche, en COM, il est possible que tu doive te taper cette gestion.
il est possible que le 8 indique une erreur tandis que le 0 indique que tout c'est bien passer, et permet de séparer les paquets.
Si tu as le 8 à chaque fois, c'est que c'est pas ça. (ou peu de chance) Enfin, ce ne sont que des conjecture, et ça manque de doc ton truc.
0
Bonjour tout le monde!
Je suis très intéressé par ce petit projet, j'ai aussi une mini appli qui devra faire appel à du matos sur port COM.
Peut-on savoir ou ça en est?
et ces "0" éparses...
ca serait pas simplement les bits de stop mal interpètés? Es-tu sur que tu a configuré ton port pour le mode de communication de ton matériel?

merci d'avance!
0
Bonjour a tous, j'ai un probleme de communication avec le protocole mobbus, j'utilise mon programme pour envoyer une trame de 8 bits, l'adresse de mon slave, la fonction 6 , la adresse initial ou il doit commencer a écrire et une donnée, sauf ue quand j'essaye de write ma trame il se bloque, a mon avis j'envoie la trame correcte parce que je l'ai deja vérifie avec le contoleur CRC, mais toujours rien, mon programme:void __fastcall TForm1::Button2Click(TObject *Sender)
{
//************************* declaration variables

int i,len, slave, function, val, mode,datalen,start_adr , *transactionID = NULL, num_register =1;

unsigned char data[4];
long maxtel;
long max_telegram_length = 1024;
char end_delimitor,p1;
char delimitor;

unsigned char crc_high, crc_low;
unsigned index;

BOOL ret;
unsigned long retlen;
// *************************

//****** initialisation des variables
datalen = 4;
slave= Edit2->Text.ToInt();
function = Edit3->Text.ToInt();
num_register =1;
end_delimitor=0x0a;
start_adr = 0;
val = Edit4->Text.ToInt();
start_adr = Edit5->Text.ToInt();
//***********
unsigned char *telptr;
int ret1,byte_count,itel;
int timeout =500, var;


// ************ initialisation de la trame à transferer

if(max_telegram_length < 256) max_telegram_length = 256;
tel = new unsigned char[max_telegram_length];
maxtel = max_telegram_length;
mode = trace =1;
delimitor = end_delimitor;

//***************request *************
data[0] = (unsigned char) (start_adr / 256);
data[1] = (unsigned char) ( start_adr & 0x0ff );
data[2] = (unsigned char) ( num_register / 256 );;
data[3] = (unsigned char) ( num_register & 0x0ff );;

//**************************************
data[2] = (unsigned char) val / 256;
data[3] = (unsigned char) val & 0x0ff;



//---------------construction de la première trame avec le numero de slave


if(slave < 0 || slave > 255) ShowMessage ("MODBUS_ERROR");
len = 0;
if(mode == 1) //modebus rtu = 1
{

tel[len++] = (unsigned char) slave;
tel[len++] = (unsigned char) function;
for(i=0; i<datalen; i++)
{
tel[len++] = (unsigned char)data[i];
if((len+2) > maxtel)
{
ShowMessage("modbus erreur");
return;
}
}
retlen = len;

/*----------------------------------------------------------------------------------------------------------*/
if(len < 0) return;
crc_high = crc_low = 0xff;
for(i=0; i<len; i++)
{
index = crc_low ^ tel[i];
crc_low = crc_high ^ array_crc_low[index];
crc_high = array_crc_high[index];
}
tel[len] = crc_low;
tel[len+1] = crc_high;
/*----------------------------------------------------------------------------------------------------------*/


}
else
{
ShowMessage("Modbus Different");
return;
}

ShowMessage("Écriture......");
if(tty->writeBlock(tel,len+2)) ShowMessage("Ecriture ok");
else ShowMessage("Écriture pas bonne");

Le probleme remonte ici dans l'ecriture du block, il gele en arrivant la

quelqun a une petite idee ou je dois envoyer la trame de control en premier????

Merci pour l'aide
0