วิธีการส่งข้อมูลไปยังพอร์ตอนุกรมและดูคำตอบใด ๆ


37

บน Linux ฉันต้องการส่งสตริงคำสั่ง (เช่นข้อมูลบางอย่าง) ไปยังพอร์ตอนุกรม (มีอักขระควบคุม) และฟังการตอบกลับ (ซึ่งโดยปกติอาจมีอักขระควบคุม)

ฉันจะทำสิ่งนี้ให้ง่ายที่สุดบน Linux ได้อย่างไร ตัวอย่างได้รับการชื่นชม!


คุณควรดูunix.stackexchange.com/a/116705/53092
Kiwy

ฉันไม่ได้ติดตั้ง interceptty
อเล็กซ์

การเสนอชื่อเพื่อเปิดใหม่ - ไม่ซ้ำกันตามที่แนะนำ
peterph

บางคนโง่เกินไปพวกเขาเพียงเสนอคำถามให้เป็นสาธารณะ ก่อนอื่นต้องอ่านคำถามและคำตอบ
เดนิส

คำตอบ:


54

อุปกรณ์ทั้งหมดใน Unix ถูกแมปไปยังไฟล์อุปกรณ์พอร์ตอนุกรมจะเป็น /dev/ttyS0 /dev/ttyS1...

ก่อนอื่นให้ดูที่การอนุญาตไฟล์นั้นให้สมมติว่าคุณกำลังใช้งาน/dev/ttyS1อยู่

ls -l /dev/ttyS1

คุณจะต้องการเข้าถึง read.write หากนี่เป็นระบบที่ใช้ร่วมกันคุณควรพิจารณาถึงผลกระทบด้านความปลอดภัยของการเปิดให้ทุกคนได้เห็น

chmod o+rw /dev/ttyS1

วิธีการที่ง่ายมากในการเขียนไฟล์จะใช้echoคำสั่งแบบง่าย

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

และเพื่ออ่าน

cat -v < /dev/ttyS1

คุณสามารถให้แมววิ่งได้ในเทอร์มินัลเดียว

หากทุกอย่างพูดพล่อยๆดังนั้นอัตราการส่งข้อมูลการตั้งค่าบิตอาจต้องตั้งค่าก่อนที่จะเริ่มส่ง sttyจะทำเช่นนั้น !! NOTE stty จะใช้ stdin เป็น file descriptor เริ่มต้นที่จะส่งผลกระทบ

คำสั่งที่เทียบเท่า

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

นี่อาจจะเพียงพอสำหรับคุณที่จะเขียนสคริปต์และบันทึก ไม่แน่ใจว่าคุณพยายามทำอะไร

สำหรับการโต้ตอบที่มากขึ้นโปรดจำไว้ว่าวิธีการตั้งค่าเริ่มต้นของคุณคือการใช้ minicomมันเป็นเพียงโปรแกรมที่ทำทุกอย่างที่ฉันได้กล่าวถึงไปแล้ว (คล้ายกับ hyperterminal ใน Windows คุณอาจคุ้นเคย)

โซลูชันระดับกลางจะใช้โปรแกรมเทอร์มินัลscreenซึ่งจะทำงานกับอุปกรณ์อนุกรม

screen /dev/ttyS1

man screen man minicom man stty สำหรับข้อมูลเพิ่มเติม


ฉันไม่ได้รับผลลัพธ์ใด ๆ เลย มีความคิดเห็นใด ๆ
Goldname

การควบคุมการไหลของฮาร์ดแวร์อาจเป็นไปได้ว่าปิดด้วยคำสั่ง atty หรือสายสูงในสายเคเบิลอนุกรมค้นหาสายเคเบิลโมเด็มที่ไม่มีค่า
X Tian

1
# stty -speed 38400 -f /dev/ttyUSB1ผลตอบแทนstty: invalid argument '-speed'
สำรองข้อมูล Pro

1
บน stty คือ -F (capital F) เพื่อตั้งค่าอุปกรณ์ นอกจากนี้พารามิเตอร์ความเร็วของคุณไม่ถูกต้อง คุณสามารถใช้ความเร็วเพื่อรับอัตรา baud ของพอร์ตหรือ ispeed หรือ ospeed (ไม่มีเครื่องหมายลบ) เพื่อตั้งค่าความเร็วอินพุตและเอาต์พุตหรือเพียงตัวเลขเพื่อตั้งค่าความเร็วอินพุตและเอาต์พุตเช่น stty 19200 -F / dev / ttyS ....
เปาโล

น่าอัศจรรย์ไม่มีใครสังเกตเห็นว่าก่อนหน้านี้ขอบคุณ @Pro Backup ฉันได้แก้ไขตัวอย่างแล้ว
X Tian

11

สิ่งที่คุณต้องทำคือเปิดสองเทอร์มินัล ในสถานีแรกคุณcatทุกอย่างจากอุปกรณ์เช่น

cat /dev/ttyS0

ในเทอร์มินัลอื่นคุณสามารถส่งอักขระฐานสิบหกและข้อความไปยังเทอร์มินัลเช่น:

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

echo -eคำสั่งช่วยให้การตีความของหนีเครื่องหมาย

สิ่งหนึ่งคือต้องแน่ใจว่าแน่นอนว่า (i) การตั้งค่าอนุกรม (ความเร็วความยาวของคำไหล ctrl ฯลฯ ) ถูกต้องและ (ii) อุปกรณ์อนุกรม (ที่ปลายอีกด้าน) ไม่ได้ปิดกั้น


คุณได้ตอบคำถามนี้ 10 นาทีหลังจากที่ฉันเขียนคำตอบของฉันด้านบนและคุณยังไม่ได้เพิ่มข้อมูลใด ๆ เลย!
X Tian

โอ้ขอโทษฉันไม่ได้อ่านคำตอบของคุณอย่างสมบูรณ์ ฉันเห็นว่าคำตอบของฉันรวมอยู่ในของคุณดังนั้นฉันจะยอมรับคำตอบของคุณเป็นคำตอบที่ถูกต้องตามที่คุณอธิบายเพียงแค่สิ่งที่ฉันได้อธิบาย
อเล็กซ์

ฉันไม่รู้เกี่ยวกับพอร์ต COM มากนัก คุณช่วยอธิบายได้ว่า "อุปกรณ์อนุกรม (ที่ปลายอีกด้าน) ไม่ได้ปิดกั้น" หมายความว่าอะไร? มีปัญหากับไฟร์วอลล์หรือไม่
Sopalajo de Arrierez

9

โปรแกรมที่คุยกับอุปกรณ์แบบอนุกรม:

picocom
minicom
socat

หรือจากเปลือกคุณสามารถทำได้:

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

คุณเป็นคำตอบที่ยอดเยี่ยมที่สอนฉันเกี่ยวกับตัวอธิบายไฟล์สองทิศทาง อย่างไรก็ตามคุณแน่ใจหรือไม่ว่าไวยากรณ์บรรทัดสุดท้ายสำหรับการปิด descriptor นั้นถูกต้อง? ฉันได้รับข้อผิดพลาดทางไวยากรณ์ ฉันคิดว่าอย่างใดอย่างหนึ่งexec 99<&-หรือexec 99>&-ควรจะใช้ หรืออาจเป็นได้ทั้งคู่?
Yankee

1
ผิด .. คุณถูกต้อง
Zibri

7

นี่อาจเป็นวิธีที่ดีกว่า:

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

นี่เป็นสิ่งที่ดีมากเพราะเป็นไปโดยอัตโนมัติ! การเปลี่ยนแปลงเพียงอย่างเดียวที่ฉันจะทำซึ่งเป็นทางเลือกโดยสิ้นเชิงคือการยืนยันว่าเนื้อหาที่ได้รับนั้นเหมือนกันกับการส่ง - อาจเป็นเพียงการนับ
HiDefLoLife

4

คุณสามารถอ่านและเขียนไปยังอุปกรณ์ได้อย่างเช่น:

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

ข้อความของคุณจะถูกส่งไปยังที่สองcatจากstdinและครั้งแรกที่catถ่ายทอดการตอบสนองต่อการstdoutเปลี่ยนขั้วของคุณให้เป็นห้องแชท

เมื่อเสร็จสิ้นการขึ้นctrl-cแล้วเรียกใช้fgจากนั้นctrl-cอีกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.