Petit pb avec cat
maxou22
-
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.
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.
A voir également:
- Petit pb avec cat
- Petit point vert snap ✓ - Forum Snapchat
- Petit 2 ✓ - Forum Windows
- Point vert sur Snapchat - Forum Snapchat
- Trier du plus petit au plus grand excel - Guide
- Comment imprimer une photo en petit ✓ - Forum Photo numérique
19 réponses
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
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
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 ;)
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 ;)
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 )
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
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
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.
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"
dd if=fichier.txt of=/dev/ttyUSB0 bs=16 count=1 2>/dev/null
echo "mot à transmettre"
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.
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.
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?
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?
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
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
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?
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?
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
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