Emmanuel Delahaye C is a sharp tool | Zelltemplar a écrit :
Je dois ecrire en C un programme qui communique avec le port série. Dans la fonction readfile,
|
Si tu veux dire 'ReadFile()', j'enclenche le mode Windows.
Citation :
il y a un champs ou il faut mettre le nombre de caractères que l'on veut recevoir.
|
Non. C'est un champ où l'on indique le nombre max de caractères lus en une fois. Ca dépend essentiellement de ton tableau de char. Mettons qu'il fasse 128 char, tu passes 128 si les données sont de type binaire, ou 128-1 si c'est du texte, de façon à le transformer en chaine en utilisant le nombre réel de caractères reçus pour placer un 0 dans le tableau.
Citation :
Le probleme c'est que je ne connais pas à l'avance le nombre de caractères que je vais recevoir, alors je met un nombre volontairement élevé, par exemple 100, mais si la personne d'en face m'envoie que 18 caracteres, alors la fonction readfile reste en attente d'un autre caractere. Comment faire pour qu'elle s'arrete? Merci d'avance et dites moi si je n'ai pas été assez clair
|
Il faut jouer sur la configuration du flux (paramètres de CreateFile). J'utilise ça:
this->h = CreateFile (strport, GENERIC_READ | GENERIC_WRITE
,0
,NULL
,OPEN_EXISTING
,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING
,NULL);
|
et voici ma lecture non blocante:
/* ---------------------------------------------------------------------
--------------------------------------------------------------------- */
size_t comm_read_non_blocking (comm_s * this, char *buf, size_t size, comm_err_e * p_err)
{
size_t nb_car_lus = 0;
comm_err_e err = COMM_OK;
if (this != NULL)
{
if (this->h != 0)
{
COMSTAT Stat;
DWORD Errors;
WORD nCarALire;
DWORD NCarLus = 0;
/* Pour connaitre le nombre d'octets dans le buffer d'entree */
ClearCommError (this->h, &Errors, &Stat);
nCarALire = Stat.cbInQue;
/* On effectue la lecture si il y a des caracteres presents */
if (nCarALire > 0)
{
PRINTF ((MODULE "nCarALire=%lu" EOL, (ulong) nCarALire));
if (nCarALire > size)
{
nCarALire = size;
}
if (ReadFile (this->h, buf, nCarALire, &NCarLus, NULL) == 0)
{
err = COMM_ERR_RECEPTION;
}
}
nb_car_lus = NCarLus;
}
else
{
/* Le port n'a pas ete ouvert */
err = COMM_ERR_CREATION;
}
this->last_err = err;
}
else
{
err = COMM_ERR_CONTEXTE;
}
if (p_err != NULL)
{
*p_err = err;
}
return nb_car_lus;
}
|
Détails sur http://msdn.microsoft.com Message édité par Emmanuel Delahaye le 16-05-2005 à 06:28:34 ---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
|