ผลลัพธ์ที่ไม่คาดคิดทดสอบลูปแบ็คอนุกรมโดยใช้ echo และ cat


18

ดังนั้นฉันจึงมีพอร์ตอนุกรม RS232 มาตรฐานที่วนกลับมาเองโดยใช้สายจาก Tx ถึง Rx ฉันกำลังทดสอบลูปแบ็คด้วยการรันechoและcatในสองเทอร์มินัลแยกกัน:

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

ปัญหาของฉันอยู่กับผลลัพธ์ ฉันคาดหวังว่าจะได้เห็น "สวัสดี" หนึ่งตัวบนแมวที่วิ่งอยู่ แต่กลับได้รับสิ่งนี้:

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

... และอื่น ๆ จนผม+ctrlc cat

หลังจากขัดจังหวะแมวถ้าฉันเรียกใช้อีกครั้งมันจะไม่ส่งออก "hi" จนกว่าฉันจะรันเสียงสะท้อนครั้งที่สอง

เป็นเรื่องปกติหรือไม่ ความคิดใดที่ว่าทำไมฉันถึงเห็นพฤติกรรมนี้

แก้ไข : โดยการขึ้นบรรทัดใหม่ผมหมายถึง 0x0AASCII ไม่มีการขึ้นบรรทัดใหม่ในเอาต์พุตนี้


อาจเกิดจากการที่กระบวนการสองกระบวนการเปิดอุปกรณ์เดียวกันได้หรือไม่ ถ้าคุณเรียกใช้tip /dev/ttyS1( ~.เพื่อออก) และลองพิมพ์ข้อมูลที่นั่น ควรแสดงในเทอร์มินัลของคุณเมื่อสายเชื่อมต่อเนื่องจากได้รับสิ่งที่ส่ง
mrb

3
คุณจริงๆได้รับการขึ้นบรรทัดใหม่หรือผลตอบแทนการขนส่ง / คู่ขึ้นบรรทัดใหม่? ความแตกต่างมีความสำคัญในระดับที่คุณกำลังทำงาน ลอง "cat / dev / ttyS1> somefile" จากนั้นทำ "od -x somefile" เพื่อดูว่าไบต์ใดที่ออกมาจากไฟล์อุปกรณ์ TTY นอกจากนี้ให้ทำ "stty -F / dev / ttyS1 -a" อ่าน man page สำหรับ "stty" และดูสิ่งที่เอาต์พุตของ stty บอกคุณสำหรับทุกการตั้งค่าเล็กน้อย comms อนุกรม RS232 นั้นยุ่งยาก
Bruce Ediger

คำตอบ:


21

ขอบคุณที่คอมเม้นท์ครั้งที่สองโดยบรูซฉันสามารถหาปัญหาด้วยตัวเอง

หลังจากทำงานstty -a -F /dev/ttyS1มี 3 ตัวเลือกที่ฉันพบว่ามีส่วนร่วมในปัญหา: "echo", "onlcr" และ "icrnl"

เนื่องจากพอร์ตอนุกรมนี้วนกลับมาที่ตัวเองนี่คือสิ่งที่เกิดขึ้นหลังจากทำงานecho "hi" > /dev/ttyS1:

  1. echoคำสั่งผนวกขึ้นบรรทัดใหม่ให้ท้ายของข้อความโดยปริยายดังนั้น "สวัสดี" + LF จะถูกส่งออกไปยัง / dev / ttyS1
  2. เนื่องจากมีการตั้งค่า "onlcr" อุปกรณ์อนุกรมจึงแปลง LF เป็น CRLF ดังนั้นข้อความทางกายภาพที่ส่งออกจากสาย Tx คือ "hi" + CRLF
  3. เนื่องจากมีการตั้งค่า "icrnl" การส่งข้อความทางกายภาพที่ได้รับบนบรรทัด Rx จะเปลี่ยน CR เป็น LF ดังนั้นข้อความที่ส่งออกโดย 'cat' คือ "hi" + LFLF
  4. เนื่องจากมีการตั้งค่า "echo" ข้อความที่ได้รับบน Rx ("hi" + LFLF) จึงถูกส่งกลับไปที่บรรทัด Tx
  5. เนื่องจาก onlcr "hi" + LFLF กลายเป็น "hi" + CRLFCRLF
  6. เนื่องจาก icrnl "hi" + CRLFCRLF จึงกลายเป็น "hi" + LFLFLFLF
  7. เนื่องจากเสียงสะท้อน "hi" + LFLFLFLF จึงส่ง Tx ออกมา

และอื่น ๆ ...

เพื่อแก้ไขปัญหานี้ฉันรันคำสั่งต่อไปนี้:

stty -F /dev/ttyS1 -echo -onlcr

การปิดใช้งาน "echo" จะป้องกันการวนซ้ำของข้อความที่ไม่สิ้นสุดและการปิดใช้งาน "onlcr" จะป้องกันไม่ให้อุปกรณ์อนุกรมแปลง LF เป็น CRLF ในเอาต์พุต ตอนนี้catได้รับหนึ่ง "สวัสดี" (ที่มีการขึ้นบรรทัดใหม่เดียว!) echoสำหรับแต่ละผมเวลาทำงาน

CR = carriage return (ASCII 0x0D); LF = ตัวดึงข้อมูลบรรทัดหรือขึ้นบรรทัดใหม่ (ASCII 0x0A)


-icrnlทำเคล็ดลับสำหรับฉัน
tcpaiva

3

ฉันมีปัญหาที่คล้ายกันรวมถึงการต่อไฟล์เข้ากับซีเรียล tty เพื่อทำการทดสอบ นอกจากคำตอบที่ยอมรับแล้ว:

หากคุณกำลังทดสอบเอาต์พุตอนุกรมโดยทำดังนี้: cat somefile.txt > /dev/ttyS0มันจะมีจำนวนข้อมูลไบต์ที่ไม่คาดคิดหากคุณกำลังทดสอบค่าไบต์ที่แน่นอน

การsttyดำเนินการอย่างง่ายstty raw -F /dev/ttyS0จะหยุดไม่ให้แทรก / เปลี่ยนอักขระ (เช่น[...] 0x0A [...]-> [...] 0x0D 0x0A [...]) rawธงการเปลี่ยนแปลงรูปแบบของอาคารจึงไม่มี input และ output การประมวลผลจะดำเนินการ


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