Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Port com sous Linux


Messages recommandés

Invité sebaleme
Posté(e)

Bonjour,

 

je suis actuellement en stage, et je dois programmer un port serie sous linux.

J´ai une erreur de code, dont je ne vois pas l´explication. Toute aide est la bienvenue.

 

voila ce que j´ai ecrit:

 

//Send of the 1st statement

int write(fd,Word,strlen(Word)); //Ici, la compilation plante, il ne veux pas des parentheses (???)

 

//Reading of the answer from the receiver

res = read(fd,buf,255);

buf[res]=0;

if(res == Word2[]) //Ici aussi.

printf("1st statement");

 

Voila, je peux eventuellement mettre le reste, mais pour ne pas trop encombrer le forum, je vais attendre un peu...

Posté(e)
int write(fd,Word,strlen(Word)); //Ici, la compilation plante, il ne veux pas des parentheses (???)
Tu essaies de faire quoi, là ? C'est la déclaration du prototype de write ? Il ne manque pas quelque chose entre "int" et l'appel à write ?

Le second problème de compilation, c'est parce que tu n'as pas de variable qui s'appelle Word2 ou parce que tu n'as pas mis d'index entre les crochets ?

Invité sebaleme
Posté(e)

Salut, merci pour ton aide, j´ai un peu avance depuis hier (c´est vrai qu´en lisant man, on apprend plein de trucs).

 

Alors,

 

mon strlen devait vouloir dire la longueur de la chaine, mais il etait tres mal utilise. J´ai donc remedie au probleme en utilisant

 

int Word[8];

 

int write (fd, Word, 8*sizeof(*Word));

 

Enfin, la aussi, ca ne marchait pas (??), alors j´ai fait:

 

int Word[8];

int lon;

lon = 8*sizeof(*Word);

int write (fd, Word, lon);

 

Et la, ca compile, mais avec un warning :

warning: parameter names (without types) in function declaration

 

Moi, tout ce que je veux, c´est envoyer le code hexadecimal FF 55 04 09 07 00 25 C7, qui se trouve dans Word[8], par la liaison serie.

Posté(e)

strlen c'est, comme son nom l'indique, pour calculer la longueur d'une chaîne. Les chaînes, en C, sont déclarées en char * et la fin de la chaîne est signalé par un caractère \0 ... Clairement, strlen n'aurait pas su quoi faire d'un tableau d'int a fortiori si celui-ci contenait un int valant 0 au milieu et aucun 0 à la fin de la "chaîne"...

Pourquoi préfixes-tu l'appel à write() de "int" ? Si c'est parce que write() retourne un int, alors sache que ce n'est pas de cette manière que l'on récupère le retour d'une fonction. Il faut d'abord déclarer une variable de type int et faire taVariable = write(bla, bla, bla);

Ta façon de calculer la longueur de Word n'est pas bonne. Habituellement on utilise sizeof() sur un type et non sur une variable : sizeof(int). On obtient la taille mémoire occupée par le type en question, ce qui permet de multiplier ensuite par le nombre d'éléments de ce type que l'on souhaite envoyer pour obtenir la taille du buffer nécessaire à l'envoi.

A quel moment valorises-tu Word ? (pour y mettre "FF 55 04 09 07 00 25 C7") ?

Invité sebaleme
Posté(e)

Salut!!

Bon, et bien on avance, en effet, ce n´etait pas tres logique de faire un sizeof sur une variable...

 

Bon, par contre, je ne suis pas sur de comprendre ce que tu dis là:

A quel moment valorises-tu Word ? (pour y mettre "FF 55 04 09 07 00 25 C7") ?

 

 

Enfin, j´ai une autre question. Apres avoir recupere les donnees du capteur, et avoir pris ce que je voulais et l´avoir mis dans ID[],

je veux enregistrer cette donnee dans un fichier texte.

 

je fais de la maniere suivante:

FILE* pvalid = NULL;

 

pvalid = fopen("IDsensor","w+");

if(pvalid == NULL) return -1;

 

for (j=0;j<8;j++)

{

fprintf(pvalid,"%d",ID[j]);

}

 

fclose(pvalid);

 

Avec pvalid, mon pointeur sur le fichier. Et ca n´a pas l´air de marcher. Pourtant, je lui dis bien d´ecrire le contenu de ID dans le fichier pointe par pvalid, qui est ici IDsensor...

Posté(e)

for (j=0;j<8;j++)
{
fprintf(pvalid,"%d\n",ID[j]);
}

 

quel est le type de ID[j] ?

  • 2 semaines après...
Invité sebaleme
Posté(e)

Bon, en fait c´est regle.

Desole de ne pas avoir repondu a la derniere question, mais j´ai du travailler sur un autre truc, et depuis, j´ai trouve une meilleur facon de m´en sortir.

 

Bon, autrement, j´ai cette ligne de code qui me fait un joli "segmentation fault, core dumped". Je pense qu´il doit y avoir une erreur dans mon code, mais ce commentaire pour le moins evasif ne me permet pas de comprendre laquelle.

 

 

f = fopen ("logclinux", "r+w");

 

for (k=0;k<30;k++)

{

printf( f, "%02X", buf[k] ) ;

 

}

 

Il semble qu´il n´accepte pas que je sois en mode r+w.

En mode w, ca marche

Posté(e)

Le paramètre "mode" de ton fopen, c'est soit "r+" soit "w" mais pas "r+w" ... D'où sors-tu ce mode ?

Les seules valeurs acceptées sont "r", "r+", "w", "w+", "a" et "a+", éventuellement suivies d'un "b" pour les systèmes qui traitent différemment les fichiers "binaires"...

 

Et es-tu bien certain d'avoir 30 valeurs dans k ?

Invité sebaleme
Posté(e)

En fait, j´ecoute un capteur via un port serie. Ce capteur m´envoie des donnees en vrac des qu´il y a du mouvement.

Donc, je ne sais pas a priori combien doit valoir K (il faudrait faire un k dynamique, comme dans les tableaux). Ce qui est genant, c´est que k peut atteindre des valeurs tres grandes (si le capteur envoie depuis longtemps).

 

Enfin, la n´est pas mon probleme actuel. Je n´arrive pas a utiliser mon fprintf. Ca cree bien un nouveau fichier, mais ca ne copie rien dedans. (j´ai fais gaffe aux droits, avec un chmod 766 pour etre sur).

 

int n = select( fd+1, &rfds, NULL, NULL, &timeout);

 

if (n<0){

printf("The buffer wasn´t read\n");

return -1;

}

 

else if (n>0)

{

while ( read( fd, buf, 100) > 0){

stay = 0;

 

for ( k=0; k<30; k++)

{

printf( "%02X", buf[k] ) ;

fprintf (f , "%02X", buf[k] );

}

}

}

 

Maintenant, mon printf marche tres bien ( sauf que je dois attendre que le buffer soit plein, soit 1000 characteres, pour qu´il affiche quelque chose, ce qui n´est pas tre pratique). Mais le fprintf ne marche pas (!!).

 

Pourquoi ???

Invité sebaleme
Posté(e)

Je precise aussi que j´ai une ligne plus haut avec

 

f = fopen ("logclinux", w+);

 

Et que je n´ai ni erreurs ni warnings lors de la compilation

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...