หลีกเลี่ยงความสับสนระหว่างอินพุตและศูนย์ในไบนารีหรือไม่?


10

สมมติว่าฉันกำลังส่งข้อมูลผ่าน FM โดยที่ 0 คือ 2Hz และ 1 คือ 4Hz เครื่องส่งกำลังส่งสัญญาณ 2Hz เมื่อไม่มีสัญญาณเข้า ถ้าฉันป้อนเลขฐานสองที่ได้รับไปยังพอร์ต UART ของไมโครคอนโทรลเลอร์ตัวควบคุมขนาดเล็กจะแยกความแตกต่างระหว่างไม่มีข้อมูลกับ 0 อย่างไร

สิ่งนี้มีความเกี่ยวข้องเมื่อมีการส่งอักขระ ASCII เช่น สมมติว่าสตริงต่อไปนี้:

01000110 01101111 01101111 01100010 01100001 01110010

เนื่องจากฉันได้เพิ่มช่องว่างเราจึงสามารถแปลสิ่งนี้เป็น:

foobar

แต่สำหรับเครื่องสตริงจะมีลักษณะเช่นนี้:

010001100110111101101111011000100110000101110010

คุณจะสร้าง "ช่องว่าง" เหล่านั้นอย่างไรเพื่อที่คุณจะไม่ได้รับตัวอักษร ASCII ที่สับสนเมื่อคุณได้รับไบนารี


5
นี่คือวิธีการแก้ UART มันเชื่อมโยง หยุดและเริ่มต้นบิตเนื่องจาก zou ป้อนไปยังพอร์ต UART zou ควรส่งผ่านเช่นกัน
Bence Kaulics

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

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

คำตอบ:


16

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

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


2
จุดสำคัญคือจำนวนบิตหยุดที่กำหนดไว้เป็นจำนวนขั้นต่ำไม่ใช่จำนวนสูงสุด สถานะที่ไม่ได้ใช้งานของซีเรียลของสายอนุกรม async เป็นบิตหยุดเพิ่ม ดังนั้นหากวิทยุต้องไม่มีการใช้งานที่ 0 คำตอบง่ายๆคือการสลับเอาท์พุท UART ก่อนขับวิทยุด้วยเพื่อที่จะไม่ได้ใช้งานที่ 0 และ 1 เป็นการเริ่มต้น จากนั้นย้อนกลับข้อมูลที่ได้รับก่อนจัดการด้วย UART
RBerteig

6

มีเป็นจำนวนมากของเทคนิคในการนี้ คุณอาจต้องการดูรหัสแมนเชสเตอร์หรือรหัส NRZ หรือการเข้ารหัส 8b / 10bซึ่งแมปบิตข้อมูล 8 บิตไปยังลำดับ 10 บิตที่อนุญาตให้กู้คืนนาฬิกาการแก้ไขข้อผิดพลาดและสัญลักษณ์ "จุลภาค" พิเศษที่สามารถใช้เพื่อตรวจจับจุดเริ่มต้นและจุดสิ้นสุดของการส่งสัญญาณ


5

อักขระ ASCII ทั้งหมดมีความกว้าง 8 บิตคุณจะเห็นได้ว่าในตาราง ASCII ค่า HEX ของอักขระ ASCII ไม่เกิน FF (1111 1111)

UART ไม่สามารถรับข้อมูลได้มากกว่าหนึ่งไบต์ (8 บิต) พร้อมกับข้อมูล 8 บิตที่มีบิตหยุดและเริ่มต้น, พาริตีและอีกสองสามซึ่งคุณสามารถดูภาพที่แสดงด้านล่างและรูปแบบแพ็คเก็ตสื่อสาร UART

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นเมื่อคุณส่งอักขระ ASCII ไปยัง UART คุณจะส่งอักขระเหล่านี้ทีละตัวและนั่นเป็นวิธีการสร้างสตริง คุณรู้อยู่แล้วว่าสตริงนั้นเป็นเพียงอาร์เรย์ของอักขระ


4
ascii คือ 7 บิตไม่ใช่ 8 อย่างไรก็ตามมันเป็นเรื่องธรรมดาที่จะใส่ลงไปในกัด 8 บิตเพื่อให้การจัดตำแหน่งเล็กน้อย นอกจากนี้ยังอนุญาตชุดอักขระอื่นและ utf8
hildred

0

โปรโตคอล UART ตามที่ Mattias อธิบายนั้นเป็นโปรโตคอลอะซิงโครนัสตามเวลา สิ่งที่กำหนดขอบเขตระหว่างบิตคือเวลาที่นำมาจากจุดเริ่มต้นของบิตเริ่มต้น ดังนั้นไมโครคอนโทรลเลอร์จะ "สุ่มตัวอย่าง" บิต(N+half)/baudrateวินาทีหลังจากเริ่มบิต ครึ่งบิตเป็นเพียงการสุ่มตัวอย่างที่อยู่ตรงกลางของบิตดังนั้นจึงสามารถมีความแตกต่างครึ่งเวลาในช่วงเวลาระหว่างเครื่องรับและเครื่องส่งสัญญาณ (โปรดจำไว้ว่าความแตกต่างจะสะสมและกรณีที่เลวร้ายที่สุดเกิดขึ้นในบิตสุดท้ายของแต่ละเฟรม แต่ไม่เสมอไปความกว้าง 8 บิตขึ้นอยู่กับการกำหนดค่า) กุญแจสำคัญในการทำให้มันใช้งานได้คือการรับและส่งสัญญาณด้วย baudrates ให้ใกล้ที่สุด

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

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

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