Hasil yang tidak terduga menguji loopback serial menggunakan echo dan cat

17

Jadi saya punya port serial RS232 standar yang di-loop kembali ke dirinya sendiri dengan hanya menjalankan kawat dari Tx ke Rx. Saya menguji loopback dengan menjalankan echodan catdi dua terminal terpisah:

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

Masalah saya adalah dengan output. Saya akan berharap untuk melihat satu "hai" kembali pada terminal running cat tetapi saya malah mendapatkan ini:

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

... dan seterusnya hingga saya ctrl+ c cat.

Setelah menyela kucing, jika saya jalankan lagi itu tidak akan menampilkan "hai" sampai saya menjalankan gema untuk kedua kalinya.

Apakah ini normal? Adakah alasan mengapa saya melihat perilaku ini?

Sunting : Menurut baris baru, maksud saya ASCII 0x0A. Tidak ada carriage return dalam output ini.

Kristina
sumber
Mungkinkah itu disebabkan oleh dua proses membuka perangkat yang sama? Bagaimana jika Anda menjalankan tip /dev/ttyS1( ~.untuk keluar) dan mencoba mengetik data di sana? Itu harus ditampilkan di terminal Anda ketika kabel terhubung, karena menerima apa yang telah ditransmisikan.
mrb
3
Apakah Anda benar - benar mendapatkan baris baru, atau pasangan carriage-return / newline? Perbedaannya penting pada level Anda bekerja. Coba "cat / dev / ttyS1> somefile" lalu lakukan "od -x somefile" untuk melihat dengan pasti byte apa yang keluar dari file perangkat TTY. Juga, lakukan "stty -F / dev / ttyS1 -a". Baca halaman manual untuk "stty" dan lihat apa yang dikatakan output dari stty, untuk setiap pengaturan kecil. Comms serial RS232 rumit.
Bruce Ediger

Jawaban:

21

Berkat komentar kedua oleh Bruce, saya bisa mencari tahu masalahnya sendiri.

Setelah berjalan stty -a -F /dev/ttyS1, ada 3 opsi yang saya temukan berkontribusi pada masalah: "echo", "onlcr", dan "icrnl".

Karena port serial ini di-loop kembali ke dirinya sendiri, inilah yang terjadi setelah menjalankan echo "hi" > /dev/ttyS1:

  1. The echoperintah menambahkan baris baru ke akhir pesan secara default, sehingga "hi" + LF dikirim ke / dev / ttyS1
  2. Karena "onlcr" disetel, perangkat serial mengubah LF ke CRLF sehingga pesan fisik yang dikirim ke saluran Tx adalah "hai" + CRLF
  3. Karena "icrnl" diset, pesan fisik yang diterima pada garis Rx mengubah CR menjadi LF. Jadi pesan yang dikeluarkan oleh 'cat' adalah "hai" + LFLF.
  4. Karena "echo" disetel, pesan yang diterima pada Rx ("hai" + LFLF), kemudian dikirim kembali pada baris Tx.
  5. Karena onlcr, "hai" + LFLF menjadi "hai" + CRLFCRLF.
  6. Karena icrnl, "hai" + CRLFCRLF menjadi "hai" + LFLFLFLF
  7. Karena gema, "hai" + LFLFLFLF kemudian dikirim keluar Tx

Dan seterusnya...

Untuk memperbaiki masalah ini, saya menjalankan perintah berikut:

stty -F /dev/ttyS1 -echo -onlcr

Menonaktifkan "echo" mencegah loop pesan yang tak terbatas dan menonaktifkan "onlcr" mencegah perangkat serial dari mengkonversi LF ke CRLF pada output. Sekarang catterima satu "hai" (dengan satu baris baru!) Untuk setiap kali saya menjalankan echo.

CR = carriage return (ASCII 0x0D); LF = umpan baris atau baris baru (ASCII 0x0A)

Kristina
sumber
-icrnlmelakukan trik untukku.
tcpaiva
3

Saya memiliki masalah yang sama juga dengan menggabungkan file ke tty serial untuk pengujian. Selain jawaban yang diterima:

Jika Anda menguji keluaran serial dengan melakukan sesuatu seperti:, cat somefile.txt > /dev/ttyS0ia akan memiliki jumlah data byte yang tidak terduga jika Anda menguji nilai byte yang tepat.

Dengan sttymelakukan hal sederhana stty raw -F /dev/ttyS0akan menghentikan terminal dari memasukkan / mengganti karakter (misalnya [...] 0x0A [...]-> [...] 0x0D 0x0A [...]). The rawbendera mengubah mode dari terminal sehingga tidak ada input dan output pengolahan dilakukan.

saya perlu tidur
sumber
1
Hmm ... sepertinya tidak stty rawmenonaktifkan gema secara default. Anda mungkin perlu melakukannya stty raw -echo.
BMiner