Bir seri portuna veri göndermek ve herhangi bir cevabı görmek nasıl?


37

Linux'ta, seri bir porta (kontrol karakterlerini içeren) bir komut dizesi (bazı veriler) göndermek ve yanıtı (genellikle kontrol karakterlerini de içerebilen) dinlemek istiyorum.

Bunu Linux'ta mümkün olduğu kadar basit bir şekilde nasıl yapabilirim? Bir örnek takdir edilir!



Yüklü interceptty yok.
Alex

yeniden açılması için aday gösterme - önerildiği gibi bir kopya değil.
peterph

bazı insanlar çok aptaldırlar, sadece başkan olarak sorular önerirler. İlk önce soruları okuma ve cevaplama zahmetine katlayın.
Denis,

Yanıtlar:


54

Unix'teki tüm cihazlar bir cihaz dosyasına eşlenir, seri portlar /dev/ttyS0 /dev/ttyS1... olur.

İlk önce bu dosyadaki izinlere bir göz atın, kullandığınızı varsayalım /dev/ttyS1.

ls -l /dev/ttyS1

Okuma.write erişimi isteyeceksiniz, eğer bu paylaşılan bir sistemse, herkes için açılmasının güvenlik sonuçlarını göz önünde bulundurmalısınız.

chmod o+rw /dev/ttyS1

Dosyaya yazmak için çok basit bir ham yöntem, basit echokomutu kullanır.

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

ve okumak

cat -v < /dev/ttyS1

Bir terminalde çalışan kedi, ikinci bir durakta eko yapabilirsiniz.

Her şey saçma sapansa, baud hızı, göndermeye başlamadan önce bit ayarlarının ayarlanması gerekebilir. sttybunu yapacak. !! NOT stty, stdin'i etkilemek için varsayılan dosya tanımlayıcısı olarak kullanacaktır.

Eşdeğer komutlar

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

Bir şeyleri yazmanız ve kaydetmeniz yeterli olabilir mi? Neyi başarmaya çalıştığından emin değilim.

Daha etkileşimli bir şekilde, varsayılan ayar yaklaşımınızın kullanıldığını hatırlamak, minicomşu ana kadar bahsettiğim her şeyi yapan bir program olduğunu kullanmaktır . (Windows’taki hiperterminallere benzer şekilde, tanıdık olabilirsiniz).

Bir ara çözüm, screenseri bir cihazda çalışacak gibi bir terminal programı kullanır .

screen /dev/ttyS1

man screen man minicom man stty daha fazla bilgi için


Hiç çıktı alamıyorum. Herhangi bir fikrin var mı?
Goldname

Muhtemelen donanım akış kontrolü, atty komutuyla kapatın veya seri kabloda yüksek kayış kullanın, boş modem kablosunu arayın.
X Tian

1
# stty -speed 38400 -f /dev/ttyUSB1dönerstty: invalid argument '-speed'
Pro Yedekleme

1
stty cihazını ayarlamak için -F (büyük harf F) 'dir. Ayrıca hız parametreniz yanlış. Portun baud hızını almak için hızı veya giriş ve çıkış hızlarını ayarlamak için ispeed veya ospeed (eksi işareti olmadan) veya sadece hem giriş hem de çıkış hızlarını ayarlamak için sadece bir sayı kullanabilirsiniz: stty 19200 -F / dev / ttyS ....
Paulus,

Şaşırtıcı kimse daha önce farketmedi, teşekkür ederim @ Pro Yedekleme Örneği düzelttim.
X Tian

11

Tek yapmanız gereken iki terminal açmak. İlk terminalde catcihazdan her şey, örn.

cat /dev/ttyS0

diğer terminalde, terminale isteğe bağlı onaltılık karakter ve metinler gönderebilirsiniz, örneğin:

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

echo -eKomut ters eğik çizgi kaçar yorumlanmasını sağlar.

Elbette (i) seri ayarlarının (hız, sözcük uzunluğu, akış ctrl, vb.) Doğru ve (ii) seri cihazın (diğer ucunda) tıkalı olmadığından emin olunmalıdır.


Bu cevabı yukarıdaki cevabımı yazdıktan sonra cevapladın ve daha fazla bilgi eklemedin!
X Tian

Üzgünüm, cevabınızı tam olarak okumadım. Cevabımın sizinkilerde yer aldığını gördüm, bu yüzden cevabınızı tam olarak tanımladıklarımı tarif ettiğiniz gibi doğru cevap olarak kabul edeceğim.
Alex

COM portları hakkında fazla bir şey bilmiyorum. "Seri cihazın (diğer ucunda) engellemediğini" ne anlama geldiğini açıklayabilir misiniz? Güvenlik duvarı ile ilgili bazı sorunlar?
Sopalajo de Arrierez 13:15

9

Seri cihazlarla konuşan programlar:

picocom
minicom
socat

veya kabuğundan yapabilecekleriniz:

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>&-

seninki bana iki yönlü dosya tanımlayıcıları hakkında öğreten harika bir cevap. Ancak, tanımlayıcıyı kapatmak için son satırın sözdiziminin doğru olduğundan emin misiniz? Sözdizimi hatası alıyorum. Ben ya exec 99<&-da exec 99>&-kullanılması gerektiğini düşünüyorum . Ya da muhtemelen her ikisi de?
Yankee

1
yazım hatası .. haklısın
Zibri

7

Bu daha iyi bir yaklaşım olabilir:

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

Bu çok iyi çünkü süreci otomatikleştiriyor! Tamamen isteğe bağlı olan ve yapacağım tek değişiklik, alınan içeriğin gönderilenle aynı olduğunu onaylamak - değişiklik yapılabilir.
HiDefLoLife

4

Aynı şekilde bir cihazı aynı anda okuyabilir ve yazabilirsiniz:

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

Mesajınız ikinci gönderilir catgelen stdinve ilk catiçin röleleri yanıtı stdoutchatroomda içine terminali dönüm.

İşlemi tamamlamak için ctrl-c, sonra çalıştırın fgsonra ctrl-ctekrar.

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.