กำลังตรวจจับบิตเริ่มต้นในซอฟต์แวร์ UART


9

ฉันกำลังทดลองเขียนซอฟต์แวร์ UART บนไมโครคอนโทรลเลอร์โดยใช้ GPIO พิน นี่คือการเพิ่มแชนเนล UART ชั่วคราวในโครงการจนกว่าเราจะได้รับการออกแบบใหม่ที่ใช้ uC พร้อมพอร์ต UART เพิ่มเติม

สิ่งที่ฉันมีปัญหาคือการตรวจสอบบิตเริ่มต้นในสตรีมแบบอนุกรมอย่างถูกต้อง แหล่งที่มาของกระแสข้อมูลภายนอกและไม่สนใจว่าอุปกรณ์ของฉันเปิดเครื่อง ดังนั้นจึงเป็นไปได้มากที่อุปกรณ์ของฉันจะเปิดและเริ่มเห็นบิตข้อมูลในระหว่างการส่งไบต์ ไม่ต้องสงสัยเลยว่านั่นจะทำให้ UART ซอฟต์แวร์ของฉันอ่านค่าผิดพลาดเนื่องจากจะไม่สามารถบอกความแตกต่างระหว่างบิตเริ่มต้นและการเปลี่ยนจากสูงไปต่ำอื่น ๆ ได้

นี่เป็นปัญหาที่หลีกเลี่ยงไม่ได้กับช่องสัญญาณ UART หรือไม่? หรือมีเคล็ดลับที่ฉลาดที่ผู้ผลิต uC ใช้ในฮาร์ดแวร์ UART ของพวกเขา?


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

คุณสามารถให้สตรีม UART ภายนอกส่งคำนำได้หรือไม่ เช่นเดียวกับสตรีมของข้อมูลพิเศษเพื่อระบุสตรีมขาเข้าที่จะแตกต่างจากบิตเริ่มต้นหรือไม่ หากคุณสามารถทำสิ่งนั้นได้คุณจะสามารถบอกได้ว่าข้อมูลนั้นผิดพลาดหรือไม่หากคุณเปิดเครื่องในระหว่างการส่งสัญญาณหรือไม่
Funkyguy

1
หากกระแสอนุกรมไม่ได้มีช่วงเวลาที่ไม่ได้ใช้งานนานพอ - คุณจะไม่สามารถกู้คืนได้ โซลูชันบางส่วนอาจมาในกรณีที่คุณไม่ได้รับบิต "หยุด" ตามที่คาดไว้ จากนั้นคุณจะสามารถรีเซ็ตสถานะและลองอีกครั้ง
ยูจีน Sh.

1
คุณไม่จำเป็นต้องมีคำนำพิเศษ ... เพียงพักเป็นครั้งคราวนานกว่าหนึ่งอักขระ (inc.start, stop bits) หรือ 10 บิตหยุดในแถวซึ่งเป็นสิ่งเดียวกัน
Brian Drummond

2
@Fuaze อุปกรณ์ภายนอกส่งตัวอักษรยาว ๆ อย่างต่อเนื่อง แต่ไม่ได้ใช้งานเป็นครั้งคราว กรณีที่เลวร้ายที่สุดฉันสามารถละเว้นอินพุตจนกระทั่งครั้งแรกที่มันไม่ทำงาน
Dan Laks

คำตอบ:


5

หากคุณใช้ความยาวสต็อปบิตที่แยกแยะได้อย่างง่ายดายจากส่วนที่เหลือของสตรีมข้อมูลเช่นเวลา 1.5 บิตคุณควรเริ่มรับการส่งกลางได้ง่าย อย่างไรก็ตามสิ่งนี้มีค่าใช้จ่ายเพิ่มขึ้น การรับส่งข้อมูลที่มีอยู่ทั้งหมดของคุณจะได้รับผลกระทบเมื่อคุณเพิ่มระยะเวลาในการหยุดบิต

หากคุณไม่ได้ใช้รถบัสที่หนักและมีช่องว่างระหว่างเฟรมบ่อยครั้งมันอาจเป็นเรื่องของการรอให้ช่องว่างเหล่านี้เกิดขึ้นจากนั้นยกการส่งสัญญาณไฮ - โลครั้งแรกเป็นจุดเริ่มต้นของคุณ บิตเริ่มถัดไป

โปรดจำไว้ว่าจำนวนบิตข้อมูลควรคาดเดาได้เช่นเดียวกับขนาดของเฟรมดังนั้นแม้ว่าคุณจะใช้ความจุของบัส 100% และบิตหยุดของคุณเป็นเวลาบิตเดียวคุณก็ควรจะหา เริ่มบิตถ้าคุณรวบรวมเฟรมเพียงพอ ทุกเฟรมรับประกันว่าจะมีการเปลี่ยนแปลง hi-lo ในนั้น บิตหยุดคืออันที่สูงเสมอ บิตเริ่มตนคือบิตที่ต่ําเสมอ สมมติว่าข้อมูลของคุณเป็นแบบสุ่ม (หรือสุ่มพอ) คุณสามารถทำอะไรง่ายๆได้ง่ายๆเพียงสร้างบัฟเฟอร์ขนาดของเฟรมตั้งค่าทุก ๆ บิตจากนั้นเก็บเฟรมต่อไปและเก็บไว้ในบัฟเฟอร์นี้จนกว่าบัฟเฟอร์จะมี 1 เท่านั้น ชุดบิต บิตนี้เป็นบิตหยุดของคุณ หนึ่งในนั้นคือบิตเริ่มต้นของคุณ Voila! คุณได้พบมัน

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


ความคิดที่ดีที่จะรวมเฟรมเข้าด้วยกันจนกระทั่งจุดเริ่มต้นและหยุดบิตอยู่รอด นั่นจะเป็นค่าใช้จ่ายที่มากเกินไปสำหรับแอปพลิเคชันเฉพาะของฉัน แต่อย่างไรก็ตามก็ยังฉลาด
Dan Laks

หากอุปกรณ์ภายนอกเป็นสิ่งที่ OP ไม่มีการควบคุม (ซึ่งเขาได้ระบุไว้ในความคิดเห็นก่อนหน้านี้กับคำถาม) มันไม่น่าเป็นไปได้ที่เขาจะสามารถเปลี่ยนความยาวของบิตหยุด
tcrosley

ความคิดเห็นนั้นไม่ได้เกิดขึ้นในขณะที่ฉันเริ่มเขียนคำตอบนี้ อย่างไรก็ตามอีกสามตัวเลือกที่ฉันได้ระบุไว้ยังคงใช้ในกรณีที่ความยาวบิตหยุดได้รับการแก้ไข
ดร. ฟังก์

3

UART ของฮาร์ดแวร์มีปัญหาเดียวกัน แต่โดยปกติจะเป็นตัวที่แก้ไขได้เองในระยะเวลาอันสั้น ในตอนท้ายของแต่ละเฟรมให้ตรวจสอบบิตหยุดและหากยังไม่สูงให้ทิ้งเฟรมและรอการเปลี่ยนจากสูงไปต่ำ สมมติว่าข้อมูลจากแหล่งที่มาไม่ใช่พยาธิวิทยาทั้งหมด (เช่นสตริงที่ยาวของ "UUUU" หรือ ASCII 0x55) ในที่สุด UART จะ "เดิน" ตัวเองไปยังบิตเริ่มต้นจริง


1

สมมติว่าการส่ง 8N1

คุณต้องรอสตริงสูง 9 หรือบิตต่ำในแถว

หากสูงจะหมายถึงช่องว่างว่างในข้อมูลหรืออักขระ 0xFF และ STOP bit
หรือ
ถ้าบิตเริ่มต้นต่ำและอักขระ NULL 0x00 ต่ำ

เงื่อนไขข้อใดข้อหนึ่งเหล่านี้จะอนุญาตการซิงโครไนซ์อีกครั้ง

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

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

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