Petit pb avec cat

maxou22 -  
 maxou22 -
Bonjour,
j'ai un souci avec un script simple que j'ai ecrit je souhaite recevoir via un port serie une donnée, la stocker dans un fichier texte, puis la renvoyer sur ce meme port serie. Voilà le code utilisé

#!/bin/sh

cat /dev/ttyUSB1 | tee "fichier3.txt"
echo "fichier3.txt" > /dev/ttyUSB1

Cela comme presenté ci dessus ne presente pas de grand interet mais il y a un interet majeur derriere ne vous inquietez pas la dessus.

Voila mon pb, c'est le cat j'ai l'impression qu'il "bloque" mon script le echo ne se fait pas car le cat attend indefiniment des données sur le port. Comment faire pour que l'on sorte du cat des le premier paquet de données recues?
Je suis debutant en C ( oui une reponse en C svp ) merci d'etre indulgent.

19 réponses

dubcek Messages postés 19032 Date d'inscription   Statut Contributeur Dernière intervention   5 641
 
hello
cat attend un end-of-file, j'uiliserais plutôt, par ex. dd pour lire un nombre fixe de bytes, 1K par exemple:
dd if=/dev/ttyUSB1 bs=1024 count=1| tee fichier3.txt

echo "fichier3.txt" écrit le texte entre " pas le fichier, sinon faire:
cat fichier3.txt > /dev/ttyUSB1
ici fichier3.txt est un fichier donc le cat va finir
0
maxou22
 
merci beaucoup dubcek j'ai vu que tu maitrisais pas mal chapea ça a l'air de marcher je te tiens au courant si mon but final fonctionne
Une petite idée de comment faire pour ne pas qu'il m'affiche ?
0+1 enregistrements lus
0+1 enregistrements écrits
6 bytes (6 B) copied, 23,4921 s, 0,0 kB/s
je n'ai pas besoin de savoir ce qu"il a fait (meme si ce n'est pas rééllement un probleme de le savoir ;)
0
dubcek Messages postés 19032 Date d'inscription   Statut Contributeur Dernière intervention   5 641
 
ajoute à la commande dd
2>/dev/null
0
maxou22
 
merci bien cela fonctionne mon nouveau petit est que je recois des caracteres parasites ( typiquement ^J voir ^ tt court)
qui me fausse ma fonction de comparaison j'ai essayé avec la commande dos2linux sans resultat je continue à chercher si tu a une commande miracle je suis preneur.
0

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

Posez votre question
dubcek Messages postés 19032 Date d'inscription   Statut Contributeur Dernière intervention   5 641
 
c'est des caractères de controle, essaye
col
ou
tr -d "[:cntrl:]"
0
maxou22
 
tr -d m'a l'air bien mais comment faire pour qu'il supprime les caracteres de controle d'un fichier donné? Car tr ne prend pas comme argument un nom de fichier... à ce que j'ai compris ( pas certain :p )
0
maxou22
 
j'ai tenté de le mettre au niveau du cat et en effet le terminal n'affiche plus les caracteres de controles, cependant ils sont toujours present dans mon fichier et lors de la comparaison j'ai toujours un probleme
voilà mon code

#!/bin/sh

stty raw < /dev/ttyUSB0
stty raw < /dev/ttyUSB1
cat fichier.txt > /dev/ttyUSB0
echo "mot à transmettre"
cat fichier.txt

dd if=/dev/ttyUSB0 of=fichier2.txt bs=1024 count=1 2>/dev/null
echo "mot transmis"
cat fichier2.txt| tr -d "[:cntrl:]"

echo " "
if diff -a -q -b -w fichier.txt fichier2.txt
then
echo "transmission ok"
else
echo "problème"
fi

il fonctionne en parrallèle avec un autre code qui marche tres bien lui

#!/bin/sh
stty raw < /dev/ttyUSB1
stty raw < /dev/ttyUSB0

dd if=/dev/ttyUSB1 of=fichier3.txt bs=1024 count=1 2>/dev/null
cat fichier3.txt > /dev/ttyUSB1
0
dubcek Messages postés 19032 Date d'inscription   Statut Contributeur Dernière intervention   5 641
 
quelle est la taille des fichiers avant et après ?
0
maxou22
 
dans mon fichier.txt j'ai seulement ecrit "test" et en sortie mon script m affiche soit test soit test^ soit test^J ... d'un façon complétement aléatoire.
0
dubcek Messages postés 19032 Date d'inscription   Statut Contributeur Dernière intervention   5 641
 
remplace les cat par dd, comme ça tu sais toujours combien de bytes tu lis ou écris. tu peux diminuer la taille, bs=16

dd if=fichier.txt of=/dev/ttyUSB0 bs=16 count=1 2>/dev/null
echo "mot à transmettre"
0
maxou22
 
avec dd c'est encore plus le bordel ça reagit pas comme je ve... En gardant le cat et en prenant la taille du dernier dd à 4 qui est pile la taille du mot test, je m'aperçois que le mot test n'est plus correctement transmis
ex :
[*****@wsdev4Lin Bureau]$ sudo sh script_envoi.sh
mot à transmettre
test
mot transmis
t
te
Les fichiers fichier.txt et fichier2.txt sont différents.
problème

mon fichier2.txt contient t et à la ligne te c'est vraiment etrange et ce qui l'est encore plus c'est le caractere aleatoire de la donnée sortante.
0
dubcek Messages postés 19032 Date d'inscription   Statut Contributeur Dernière intervention   5 641
 
fais
hd -C
pour voir le code des caractères
0
dubcek Messages postés 19032 Date d'inscription   Statut Contributeur Dernière intervention   5 641
 
tu peux faire aussi hd -C /dev/ttyUSB0
0
maxou22
 
cette fonction ne marche pas comme tel. Et le man me dit que hd correspond aux disques durs et donc pas une fonction du coup l'instruction comme tel ne marche pas.
J'ai aussi relever quelque chose de vraiment bizarre en fait je te rappelle le but generale je souhaite envoyer une donnée via le port 0 (la donnée qui est dans fichier.txt) , à l aide d'un rebouclage je la recois sur le port 1 je la stocke dans fichier3.txt et la renvoie sur le port1 elle revient sur le port 0 donc et la je la stocke dans fichier2.txt.
Puis je fais un diff de fichier.txt ( ma donnée de depart) et fichier2.txt ( ma donnée d arrivée).

Ce que j'ai remarqué c'est que il se stocke nimporte quoi dans fichier3.txt c'est bizarre je ne comprend pas pourquoi sachant que fichier2.txt ressemble beaucoup a fichier.txt, parfois il y a correspondance, souvent il manque des caracteres.

comprend tu ce que je veux dire?
0
dubcek Messages postés 19032 Date d'inscription   Statut Contributeur Dernière intervention   5 641
 
si hd (hexa dump) n'est pas recxonnu, essaye od -c
c'est toujours problématique de transférer par des commandes standards des données sur un port série
il faudrait essayer de tourner les 2 commandes en parallèle, un port série ne stocke pas
dans cet ordre
# reception
dd if=/dev/ttyUSB1 of=fichier2.txt bs=16 count=1 2>/dev/null &
# emission
cat fichier.txt > /dev/ttyUSB0
0
maxou22
 
c'est bien ce que je faisais j'ouvre 2 terminals et lance mes 2 scripts en parallèle en ayant bien commencer par le bon.
Pour voir d'ou vient mon pb j'ai essayé de faire les etapes du script manuellement à la suite dans l'ordre que j'aimerai et là je trouve quelque chose de bizarre

1)dd if=/dev/ttyUSB1 of=fichier3.txt bs=16 count=1 2>/dev/null & // ok le terminal se met en attente d'une donnée sur le port

2)cat fichier.txt > /dev/ttyUSB0 // la donnée est envoyée le premier terminal sort donc de dd (dans fichier3.txt il y a bien les memes données que dans fichier.txt)

3)dd if=/dev/ttyUSB0 of=fichier2.txt bs=16 count=1 2>/dev/null & // la je souhaite que les données, qui ont été recues par le port1 et qui vont etre réenvoyées sur le port0 soient stockées dans fichier2.txt.

4)cat fichier3.txt > /dev/ttyUSB1 // jenvoi les données sur le port.

script 1 script 2
1) ------> 2)
/
/
/
3) ------> 4)

le pb est à l'étape 3)! Sans faire l'etape 4 l'étape 3 se fait et stocke dans fichier2.txt une donnée incorrecte, létape 4 est alors effectuée mais ne sert a rien vu que fichier2 a deja été ecrit.
suis-je clair?
J'ai l'impression que c'est un effet indesirable du rebouclage qui garde sur le port une mauvaise donnée.
Qu'en pense tu?
0
maxou22
 
Apres quelque modifs ( j'ai notamment inséré un tr-d pour virer ces ^J ) je m'apercois d'un phenomene etrange

pour des mots à tester de 4 lettres ou moins => aucun pb
pour des mots de 5 lettres => le premier essai marche nikel apres je suis obligé de debranché l adaptateur USB/serie pour recommencer et avoir un bon resultat
pour des mots de 6lettres ou + => le premier essai m'affiche correctement les 5 premieres lettres du mort et seulement ça, les essais suivants montre nimporte quoi encore?

J'en deduit que le pb vient d'un pb de taille au niveau de la transmission mais la j'ai tt essayé pour les valeurs de bs dans la fonction dd sans resultat je ne comprend pas. Existe il une fonction pour le terminal pour vider les buffer? fflush ne marche pas dans le terminal
0
dubcek Messages postés 19032 Date d'inscription   Statut Contributeur Dernière intervention   5 641
 
je ne sais pas très bien
par contre avec dd, si on envoie 16 bytes mais que le fichier en fait 5, on peut le forcer de compléter avec des blancs avec
conv=block,sync
0
maxou22
 
c'est dingue j'utilise ta commande
j'ai fait des test pour un mot test de 1,2,3,4 lettres aucun pb sa marche nikel.
Pour 5 lettres sur 20 test 1fois sur 2 exactement ça marche l'autre fois ça oublie la derniere lettre
Oo je ne comprend pas :(
0