Communication port série

jysuispresque Messages postés 2 Date d'inscription mardi 29 novembre 2005 Statut Membre Dernière intervention 30 novembre 2005 - 29 nov. 2005 à 20:56
jysuispresque Messages postés 2 Date d'inscription mardi 29 novembre 2005 Statut Membre Dernière intervention 30 novembre 2005 - 30 nov. 2005 à 13:07
Bonjour,
J'utilise le sous-programme ci-joint (C++ Borland v.5) pour envoyer et récupérer des données par voie série à partir d'un capteur. Mon problème est le suivant : quand j'envoie les données au capteur afin qu'il commence la mesure, tout va bien, il comprend ce qui est transmis et démarre l'envoi de données. Mais c'est à la lecture que rien ne va plus : les données lues sont incompréhensibles, et je n'arrive pas à savoir pourquoi. Par ailleurs, le capteur fonctionne et ce n'est donc pas de lui que provient l'erreur.
Toute contribution est la bienvenue,
Jean-Michel

void TBD_Modale3::B_OK3()
{
HANDLE mon_hand1;
DCB dcb1;
DWORD error1;
BOOL fSuccess,fSuccess1,fSuccess2,bResult,bResult1;
char buf[15];
COMMTIMEOUTS tTimeout;
int TimeoutRead;
unsigned char inBuffer[100];
char *Message;
unsigned long nBytesRead;
char *ChaineRecue;
int NbOctet;
unsigned long nBytesWrite;
char *Port;

Port="COM1";

mon_hand1 = CreateFile(Port, GENERIC_READ| GENERIC_WRITE,0 ,
NULL , OPEN_EXISTING , 0 , NULL);

if (mon_hand1==INVALID_HANDLE_VALUE)
Capteur1->SetText("pb");
else
Capteur1->SetText("ok");

fSuccess = GetCommState(mon_hand1, &dcb1);

dcb1.BaudRate = 57600;
dcb1.DCBlength = 100000;
dcb1.ByteSize = 8;
dcb1.Parity = NOPARITY;
dcb1.StopBits = ONESTOPBIT;
dcb1.fBinary=1;
dcb1.fParity=0;
dcb1.fOutxCtsFlow=0;
dcb1.fOutxDsrFlow=0;
dcb1.fDtrControl=0;
dcb1.fDsrSensitivity=0;
dcb1.fTXContinueOnXoff=0;
dcb1.fRtsControl=0;

fSuccess1 = SetCommState(mon_hand1, &dcb1);
if (fSuccess1!=0)
Capteur2->SetText("ok");
else
Capteur2->SetText("pb");

Message=new char[6];
char char1=0x1B, char2=0x06, char3=0x00, char4=0x05, char5=0x00, char6=0x00;
sprintf(Message,"%c%c%c%c%c%c",char1,char2,char3,char4,char5,char6);
NbOctet = 6;
bResult1 = WriteFile(mon_hand1,Message,NbOctet,&nBytesWrite,NULL);

if (bResult1!=0)
Capteur4->SetText("ok");
else
Capteur4->SetText("pb");

sprintf(buf,"%i",nBytesWrite);
Capteur5->SetText(buf);

ChaineRecue=new char[6];
TimeoutRead = 500;
tTimeout.ReadIntervalTimeout = MAXWORD;
tTimeout.ReadTotalTimeoutMultiplier = 0;
tTimeout.ReadTotalTimeoutConstant = TimeoutRead;
tTimeout.WriteTotalTimeoutMultiplier = 0;
tTimeout.WriteTotalTimeoutConstant = 0;

fSuccess2 = SetCommTimeouts(mon_hand1,&tTimeout);
if (fSuccess2!=0)
Capteur3->SetText("ok");
else
Capteur3->SetText("pb");

bResult = ReadFile(mon_hand1,inBuffer,6,&nBytesRead,NULL);

if (bResult!=0)
Capteur6->SetText("ok");
else
Capteur6->SetText("pb");

sprintf(buf,"%i",nBytesRead);
Capteur7->SetText(buf);

sprintf(ChaineRecue,"%s",inBuffer);

sprintf(buf,"%c", ChaineRecue[0]);
Capteur8->SetText(buf);
sprintf(buf,"%c", ChaineRecue[1]);
Capteur9->SetText(buf);
sprintf(buf,"%c", ChaineRecue[2]);
Capteur10->SetText(buf);
sprintf(buf,"%c", ChaineRecue[3]);
Capteur11->SetText(buf);
sprintf(buf,"%c", ChaineRecue[4]);
Capteur12->SetText(buf);
sprintf(buf,"%c", ChaineRecue[5]);
Capteur13->SetText(buf);

delete[] Message;
delete[] ChaineRecue;
CloseHandle(mon_hand1);
}

3 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
29 nov. 2005 à 23:35
if(mon_hand1==INVALID_HANDLE_VALUE)
Capteur1->SetText("pb");
OK mais faudrait aussi un 'return' car si pas bon le handle STOP.


Message=new char[6];
char char1=0x1B, char2=0x06, char3=0x00, char4=0x05, char5=0x00, char6=0x00;
sprintf(Message,"%c%c%c%c%c%c",char1,char2,char3,char4,char5,char6);
Tu es certain que tout cela tient dans les 6 octets de 'Message' ???
Evite aussi de faire tourner le memory manager pour quelques octets qui iront très bien sur la pile:
char Message[24]; // plus imple et nettement + rapide


Commence déjà par cela, on regardera plus bas ensuite.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
30 nov. 2005 à 09:35
dcb1.DCBlength = 100000;
> dcb1.DCBlength sizeof(DCB); il faut donner la taille de la structure

vu que c'est plutôt des octets que des caractères affichables que tu envoi, les afficher en hexa serait mieux,
=> %c à remplacer par %02X.

a priori tu es suceptible de recevoir des octets à 0 (vu que tu en envoi, mais c'est une supposition)
=> il faut spécifier que tu veux les recevoir
dcb1.fNull = FALSE;
0
jysuispresque Messages postés 2 Date d'inscription mardi 29 novembre 2005 Statut Membre Dernière intervention 30 novembre 2005
30 nov. 2005 à 13:07
Merci Brunews; j'ai effectué les modifs conseillées. En vérifiant par
Debug, les 6 octets paraissent suffisants; cependant j'ai fixé le
nombre à 24. Mais le problème reste entier...



Merci ymca2003, effectivement j'envoie et je reçois des octets à 0. En
fait, pour tester le capteur, j'envoie 0x1B 0x06 0x00 0x05 0x00 0x00 ,
et il doit me renvoyer la même chose;

j'ai modifié le dcb1 comme proposé, mais je ne reçois pas encore la bonne réponse, même s'il y a du progrès...
0
Rejoignez-nous