Bagaimana cara mengirim data ke port serial dan melihat jawaban apa pun?


37

Di Linux, saya ingin mengirim string perintah (yaitu beberapa data) ke port serial (berisi karakter kontrol), dan mendengarkan respons (yang juga biasanya mungkin berisi karakter kontrol).

Bagaimana saya bisa melakukan ini sesederhana mungkin di Linux? Sebuah contoh dihargai!



Saya tidak memasang interceptty.
Alex

1
mencalonkan untuk dibuka kembali - ini bukan duplikat seperti yang disarankan.
peterph

beberapa orang terlalu bodoh mereka hanya menyarankan pertanyaan sebagai dublicate. Pertama-tama susah-susah membaca pertanyaan dan jawabannya.
Denis

Jawaban:


54

Semua perangkat di Unix dipetakan ke file perangkat, port serialnya adalah /dev/ttyS0 /dev/ttyS1....

Pertama-tama lihatlah izin pada file itu, mari kita asumsikan Anda menggunakan /dev/ttyS1.

ls -l /dev/ttyS1

Anda akan ingin akses read.write, jika ini adalah sistem bersama maka Anda harus mempertimbangkan konsekuensi keamanan dari membukanya untuk semua orang.

chmod o+rw /dev/ttyS1

Metode mentah yang sangat sederhana untuk menulis ke file, akan menggunakan echoperintah sederhana .

echo -ne '\033[2J' > /dev/ttyS1

dan membaca

cat -v < /dev/ttyS1

Anda dapat membuat kucing berjalan di satu terminal, dan menggema di ke-2.

Jika semuanya omong kosong, maka baud rate, pengaturan bit mungkin perlu pengaturan sebelum Anda mulai mengirim. sttyakan melakukan itu. !! CATATAN stty akan menggunakan stdin sebagai deskriptor file default untuk mempengaruhi.

Perintah Setara.

stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1

Ini mungkin cukup bagi Anda untuk skrip sesuatu dan masuk? Tidak yakin apa yang ingin Anda capai.

Untuk yang lebih interaktif, ingat pendekatan pengaturan default Anda akan menggunakannya minicomhanya sebuah program yang melakukan semua yang saya sebutkan sejauh ini. (mirip dengan hyperterminal di Windows, Anda mungkin akrab).

Solusi perantara, akan menggunakan program terminal seperti screenyang akan bekerja pada perangkat serial.

screen /dev/ttyS1

man screen man minicom man stty untuk informasi lebih lanjut


Saya tidak mendapatkan hasil sama sekali. Punya ide?
Goldname

Mungkin kontrol aliran perangkat keras, baik matikan dengan perintah atty atau mengikat kabel serial tinggi, mencari kabel modem nol.
X Tian

1
# stty -speed 38400 -f /dev/ttyUSB1pengembalianstty: invalid argument '-speed'
Pro Backup

1
pada stty itu -F (huruf kapital F) untuk mengatur perangkat. Parameter kecepatan Anda juga salah. Anda dapat menggunakan kecepatan untuk mendapatkan baud rate port, atau kecepatan atau kecepatan (tanpa tanda minus) untuk mengatur kecepatan input dan output, atau hanya angka untuk mengatur kecepatan input dan output, seperti: stty 19200 -F / dev / ttyS ....
Paulus

Luar biasa tidak ada yang memperhatikan itu sebelumnya, terima kasih @ Pro Backup. Saya telah memperbaiki contohnya.
X Tian

11

Yang harus Anda lakukan adalah membuka dua terminal. Di terminal pertama Anda catsemuanya dari perangkat, misalnya

cat /dev/ttyS0

di terminal lain, Anda dapat mengirim karakter hex dan teks sewenang-wenang ke terminal misalnya sebagai berikut:

echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0

Itu echo -e perintah memungkinkan penafsiran lolos backslash.

Kita harus memastikan tentu saja bahwa (i) pengaturan serial (kecepatan, panjang kata, flow ctrl, dll) sudah benar dan (ii) perangkat serial (di ujung lainnya) tidak menghalangi.


Anda telah menjawab ini 10 menit setelah saya menulis jawaban saya di atas dan Anda belum menambahkan informasi lebih lanjut sama sekali!
X Tian

Oh maaf, saya tidak membaca jawaban Anda dengan lengkap. Saya melihat bahwa jawaban saya termasuk dalam jawaban Anda, jadi saya akan menerima jawaban Anda sebagai jawaban yang benar, seperti yang Anda jelaskan seperti yang saya jelaskan.
Alex

Saya tidak tahu banyak tentang port COM. Bisakah Anda jelaskan apa artinya "perangkat serial (di ujung lain) tidak menghalangi"? Ada masalah dengan firewall?
Sopalajo de Arrierez

9

Program yang berbicara dengan perangkat serial:

picocom
minicom
socat

atau dari shell dapat Anda lakukan:

stty -speed 19200 < /dev/ttyS0 # sets the speed of the port
exec 99<>/dev/ttyS0 (or /dev/ttyUSB0...etc)
printf "AT\r" >&99
read answer <&99  # this reads just a CR
read answer <&99  # this reads the answer OK
exec 99>&-

Anda adalah jawaban yang luar biasa yang mengajari saya tentang deskriptor file dua arah. Namun, apakah Anda yakin sintaks baris terakhir untuk menutup deskriptor benar? Saya mendapatkan kesalahan sintaksis. Saya pikir salah satu exec 99<&-atau exec 99>&-harus digunakan. Atau mungkin keduanya?
Yankee

1
salah ketik .. Anda benar
Zibri

7

Ini bisa menjadi pendekatan yang lebih baik:

stty -F /dev/ttyUSB0 115200 raw -echo   #CONFIGURE SERIAL PORT
exec 3</dev/ttyUSB0                     #REDIRECT SERIAL OUTPUT TO FD 3
  cat <&3 > /tmp/ttyDump.dat &          #REDIRECT SERIAL OUTPUT TO FILE
  PID=$!                                #SAVE PID TO KILL CAT
    echo "R" > /dev/ttyUSB0             #SEND COMMAND STRING TO SERIAL PORT
    sleep 0.2s                          #WAIT FOR RESPONSE
  kill $PID                             #KILL CAT PROCESS
  wait $PID 2>/dev/null                 #SUPRESS "Terminated" output

exec 3<&-                               #FREE FD 3
cat /tmp/ttyDump.dat                    #DUMP CAPTURED DATA

Ini sangat bagus karena mengotomatiskan proses! Satu-satunya perubahan yang akan saya buat, yang sepenuhnya opsional, adalah untuk mengkonfirmasi konten yang diterima sama dengan yang dikirim - bisa jadi hanya hitungan atau penuh pada diff.
HiDefLoLife

4

Anda dapat membaca dan menulis ke perangkat secara simultan seperti:

cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411

Pesan Anda dikirim ke yang kedua catdari stdin, dan yang pertamacat menyampaikan tanggapan stdout, mengubah terminal Anda menjadi ruang obrolan.

Untuk menyelesaikan, ctrl-c, kemudian jalankan fgkemudian ctrl-clagi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.