บน Linux ฉันต้องการส่งสตริงคำสั่ง (เช่นข้อมูลบางอย่าง) ไปยังพอร์ตอนุกรม (มีอักขระควบคุม) และฟังการตอบกลับ (ซึ่งโดยปกติอาจมีอักขระควบคุม)
ฉันจะทำสิ่งนี้ให้ง่ายที่สุดบน Linux ได้อย่างไร ตัวอย่างได้รับการชื่นชม!
บน Linux ฉันต้องการส่งสตริงคำสั่ง (เช่นข้อมูลบางอย่าง) ไปยังพอร์ตอนุกรม (มีอักขระควบคุม) และฟังการตอบกลับ (ซึ่งโดยปกติอาจมีอักขระควบคุม)
ฉันจะทำสิ่งนี้ให้ง่ายที่สุดบน Linux ได้อย่างไร ตัวอย่างได้รับการชื่นชม!
คำตอบ:
อุปกรณ์ทั้งหมดใน 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
สำหรับข้อมูลเพิ่มเติม
# stty -speed 38400 -f /dev/ttyUSB1
ผลตอบแทนstty: invalid argument '-speed'
สิ่งที่คุณต้องทำคือเปิดสองเทอร์มินัล ในสถานีแรกคุณcat
ทุกอย่างจากอุปกรณ์เช่น
cat /dev/ttyS0
ในเทอร์มินัลอื่นคุณสามารถส่งอักขระฐานสิบหกและข้อความไปยังเทอร์มินัลเช่น:
echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0
echo -e
คำสั่งช่วยให้การตีความของหนีเครื่องหมาย
สิ่งหนึ่งคือต้องแน่ใจว่าแน่นอนว่า (i) การตั้งค่าอนุกรม (ความเร็วความยาวของคำไหล ctrl ฯลฯ ) ถูกต้องและ (ii) อุปกรณ์อนุกรม (ที่ปลายอีกด้าน) ไม่ได้ปิดกั้น
โปรแกรมที่คุยกับอุปกรณ์แบบอนุกรม:
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>&-
exec 99<&-
หรือexec 99>&-
ควรจะใช้ หรืออาจเป็นได้ทั้งคู่?
นี่อาจเป็นวิธีที่ดีกว่า:
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
คุณสามารถอ่านและเขียนไปยังอุปกรณ์ได้อย่างเช่น:
cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411
ข้อความของคุณจะถูกส่งไปยังที่สองcat
จากstdin
และครั้งแรกที่cat
ถ่ายทอดการตอบสนองต่อการstdout
เปลี่ยนขั้วของคุณให้เป็นห้องแชท
เมื่อเสร็จสิ้นการขึ้นctrl-c
แล้วเรียกใช้fg
จากนั้นctrl-c
อีกครั้ง