Echo ve cat kullanarak seri geri döngü testi beklenmeyen sonuçlar


18

Bu yüzden sadece Tx'den Rx'e bir kablo çalıştırarak kendisine geri döngü yapan standart bir RS232 seri portuna sahibim. Ben geri döngü çalıştırarak echove catiki ayrı terminalde test ediyorum :

cat /dev/ttyS1
echo "hi" > /dev/ttyS1

Benim sorun çıktı ile. Bir "merhaba" terminal çalışan kedi geri gelmesini görmek beklenir ama bunun yerine bunu elde:

hi
[2 newlines]
hi
[4 newlines]
hi
[8 newlines]
hi
[16 newlines]
hi
[32 newlines]
hi

... ve ben ctrl+ 'a kadar devam eder c cat.

Kediyi kesintiye uğrattıktan sonra tekrar çalıştırırsam yankı ikinci kez çalıştırılıncaya kadar "hi" ler çıkmaz.

Bu normal mi? Bu davranışı neden gördüğüm hakkında bir fikrin var mı?

Düzenleme : Newline ile ASCII demek istiyorum 0x0A. Bu çıktıda satır başı yok.


Aynı cihazı açan iki işlemin olması neden olabilir mi? Çalıştırırsanız tip /dev/ttyS1( ~.çıkmak için) ve buraya veri yazmayı denediyseniz ne olur ? Tel bağlandığında, ilettiği şeyi aldığı için terminalinizde görüntülenmelidir.
mrb

3
Eğer Are gerçekten yeni satır almak ya da bir satır başı / satır çifti? Ayrım, çalıştığınız seviyede önemlidir. "Cat / dev / ttyS1> somefile" komutunu deneyin ve TTY aygıt dosyasından tam olarak hangi baytların geldiğini görmek için "od -x somefile" komutunu kullanın. Ayrıca, bir "stty -F / dev / ttyS1 -a" yapın. "Stty" için man sayfasını okuyun ve her küçük ayar için stty çıktısının size ne söylediğine bakın. RS232 seri iletişimleri zor.
Bruce Ediger

Yanıtlar:


21

Bruce'un ikinci yorumu sayesinde, sorunu kendi başıma anlayabildim.

Çalıştırdıktan sonra stty -a -F /dev/ttyS1"ONLCR", "yankı" ve "ICRNL": Ben soruna katkıda bulunmuştur 3 seçenek vardı.

Bu seri bağlantı noktası kendi kendine geri döndüğünden, çalıştırdıktan sonra olan şey şudur echo "hi" > /dev/ttyS1:

  1. echoKomut böylece "Merhaba" + LF / dev / ttyS1 için gönderilen varsayılan olarak iletinin sonuna bir yeni satır, ekler
  2. "Onlcr" ayarlandığından, seri cihaz LF'yi CRLF'ye dönüştürdü, böylece Tx satırından gönderilen fiziksel mesaj "hi" + CRLF oldu
  3. "İcrnl" ayarlandığından, Rx hattında alınan fiziksel mesajlar CR'yi LF'ye dönüştürdü. Yani 'cat' tarafından gönderilen mesaj "hi" + LFLF idi.
  4. "Echo" ayarlandığından, Rx ("hi" + LFLF) üzerinden alınan mesaj daha sonra Tx satırında geri gönderilir.
  5. Onlcr nedeniyle, "hi" + LFLF "hi" + CRLFCRLF oldu.
  6. İcrnl nedeniyle, "hi" + CRLFCRLF "hi" + LFLFLFLF oldu
  7. Yankı nedeniyle, "hi" + LFLFLFLF daha sonra Tx'e gönderildi

Ve bunun gibi...

Bu sorunu gidermek için aşağıdaki komutu çalıştırdım:

stty -F /dev/ttyS1 -echo -onlcr

"Echo" devre dışı bırakıldığında sonsuz bir ileti döngüsü engellenir ve "onlcr" devre dışı bırakılırsa, seri aygıt çıktıda LF'yi CRLF'ye dönüştürür. Şimdi catbir "Merhaba" (tek bir yeni satır!) Aldığı koşuyorum her sefer için echo.

CR = satır başı (ASCII 0x0D); LF = satır besleme veya yeni satır (ASCII 0x0A)


-icrnlbenim için hile yaptı.
tcpaiva

3

Ben de test için seri bir tty içine dosyaları birleştirme ile de benzer bir sorun vardı. Kabul edilen cevaba ek olarak:

Seri çıkışı aşağıdaki gibi bir şeyle cat somefile.txt > /dev/ttyS0test ediyorsanız, kesin bayt değerlerini test ediyorsanız, iyi miktarda beklenmedik bayt verisi olacaktır.

İle sttybir basit yapıyor stty raw -F /dev/ttyS0karakterleri değiştirerek / eklemektir gelen terminali duracaktır (örn [...] 0x0A [...]-> [...] 0x0D 0x0A [...]). rawBir giriş ve çıkış işlemi gerçekleştirilir, böylece uygun terminal modları değiştirir.


1
Hmm ... stty rawyankılamayı varsayılan olarak devre dışı bırakacak gibi görünmüyor . Yapmanız gerekebilir stty raw -echo.
BMiner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.