Probléme de récupération des données à travers ttyS (LINUX) [C] - C - Programmation
Marsh Posté le 08-05-2009 à 23:32:12
et read peut renvoyer -1 sans que ça soit EOF. Regarde errno
Marsh Posté le 08-05-2009 à 23:45:53
Juste une petite précision, c'est que je suis un débutant et donc ça peu arriver que je ne comprend pas trop ce que vous me dite.
Si j'ai bien compris, mon write réussi bien puisque j'ai qd mm quelque chose en sortie.
Citation : et read peut renvoyer -1 sans que ça soit EOF. Regarde errno |
errno n'est renvoyé que qd l'ouverture na pas réussi !!?!
Code :
|
ou bien le faite que read peut renvoyer -1, ça générera un errno qd mm ???
Merci
Marsh Posté le 09-05-2009 à 12:34:01
man 2 read
man 2 write
dans tous les cas, il faut bien que tu contrôles le retour de ces fonctions et errno pour t'assurer que tu as reçu/envoyé le bon nombre de char, sinon savoir pourquoi (EINTR par exemple).
1) regarder le code de retour
2) si < 0, l'interpréter en fonction de la valeur d'errno.
Marsh Posté le 15-05-2009 à 14:01:10
Salut,
Dit moi, comment faire pour tester le retour sur read et write
Désolé, je suis un débutant donc veille à m'excuser pour ces questions qui peuvent sembler pas à la hauteur !
Merci
Marsh Posté le 15-05-2009 à 14:59:31
ssize_t ret = read(...);
if (ret < 0) { analyzer errno et prendre une décision }
if (ret == 0) { EOF }
if (ret > 0) { comparer ret avec la quantité de données que tu avais demandé; }
idem pour write
Marsh Posté le 08-05-2009 à 23:26:54
Bonjour, j'ai un gros problème que je n'arrive tjrs pas à résoudre !
Je dois récupérer des données provenant d'un montage électronique sur une carte équipée d'un noyau LINUX (FOX Board).
Donc pour ce faire j'ai un code en C que j'exécute sur la carte et qui permet d'ouvrir une connexion série (virtuelle) à travers une connexion Bluetooth (rfcomm0) pour envoyer les donnée de mon montage à la carte FOX Board.
Ce code en effet marche très bien, mes données arrivent, mais seulement, elles n'arrivent pas comme il faut:
j'envoie des trames de 19 bytes dans un certain ordre bien déterminé, le problème c'est que pratiquement une trame sur 10 n'arrive pas dans l'ordre et certaines trames arrivent avec un byte ou deux qui manquent !!!!
J'ai testé l'envoi de ces données sur un PC avec Hyperterminal et Docklight, mes trames arrivent correctement !
Donc le problème vient de mon code C que j'exécute sur la carte (FOX Board), je met le code plus bas si quelqu'un à une solution à mon problème ça m'aidera bcp, d'autant plus je doit finaliser ce projet ds quelque jours !
MERCI POUR VOTRE AIDE
Exemple de Données correcte:
----------------------------
Chaque trame commence par 02 EA et se termine par 03 comme ci dessous (les xx représentent des valeurs qui peuvent changer)
02 EA xx xx xx xx 00 00 00 00 00 00 00 00 00 00 00 00 03
02 EA 3E 00 49 E1 00 00 00 00 00 00 00 00 00 00 00 00 03
02 EA 3C E1 39 E1 00 00 00 00 00 00 00 00 00 00 00 00 03
02 EA 3D 00 40 E1 00 00 00 00 00 00 00 00 00 00 00 00 03
02 EA 40 02 56 E2 00 00 00 00 00 00 00 00 00 00 00 00 03
02 EA 40 82 5A E2 00 00 00 00 00 00 00 00 00 00 00 00 03
02 EA 40 00 5B E2 00 00 00 00 00 00 00 00 00 00 00 00 03
02 EA 41 AC 62 E1 00 00 00 00 00 00 00 00 00 00 00 00 03
...
Exemple de Données incorrecte:
-----------------------------
02 EA 58 00 84 E1 00 00 00 00 00 00 00 00 00 00 00 00 03
02 00 00 00 00 00 00 00 00 03 EA 55 00 66 E1 00 00 00 00
02 EA 53 00 4C E1 00 00 00 00 00 00 00 00 00 00 00 00 03
02 EA 4E 01 CA E1 00 00 00 00 00 00 00 00 00 00 00 00 03
02 EA 50 02 1D E1 00 00 00 00 00 00 00 00 00 00 00 00 03
02 00 00 00 00 00 00 00 03 EA 5E 01 E1 00 00 00 00 00 02
EA 60 01 64 E1 00 00 00 00 00 00 00 00 00 00 00 00 03 02
EA 00 01 1D E1 00 00 00 00 00 00 00 00 00 00 00 00 03 02
EA 00 01 2B E1 00 03 02 EA 00 01 94 E1 00 00 00 00 00 00
00 00 00 00 00 00 03 02 EA 00 01 CA 00 00 00 00 00 00 00
00 00 00 00 03 02 EA 00 01 62 E1 00 00 00 00 00 00 00 00
00 00 00 00 E1 00 00 00 00 00 00 00 00 00 00 00 00 03 02
EA 00 02 1D E1 00 00 00 00 00 00 00 00 00 00 00 00 03 02
EA 00 41 E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 03 02 EA 00 03 02 EA 00 41 64 E1 00
...
CODE C pour l'ouverture de la communication serie sur la carte LINUX: