วิธีอ่านข้อมูลอนุกรมจากออสซิลโลสโคป


21

ฉันมีไมโครคอนโทรลเลอร์ (PICAXE 20X2) และหม้อมิเตอร์ ฉันตั้งโปรแกรมไมโครเพื่อที่จะส่งการเปลี่ยนแปลงใด ๆ ของหม้อมิเตอร์ไปยังพอร์ตอนุกรมของพีซี เห็นได้ชัดว่ามันเป็น 8 บิต ADC ทีนี้สิ่งที่น่าสนใจสำหรับฉันคือสามารถถอดรหัสข้อมูลอนุกรมนี้บนออสซิลโลสโคปได้

นี่คือภาพสองภาพรูปแรกคือเมื่อไมโครกำลังส่ง "0" ไปยังพีซีและอีกภาพหนึ่งคือเมื่อมันส่ง "255" ข้อมูลกำลังถูกส่งโดยใช้ 9600 buad และฉันสามารถรับได้ที่เครื่องคอมพิวเตอร์

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

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

ดังนั้นคำถามของฉันคือฉันได้รวบรวมข้อมูลที่ถูกต้องในขอบเขตของฉันและที่สองว่าหนึ่งสามารถอ่านและถอดรหัสพัลส์นี้ในรูปแบบฐานสิบหกหรือ ascii ฉันหมายถึงวิธีการอ่านพัลส์ที่เพิ่มขึ้นและลดลงนี้ (0/1)

ขอบคุณ


3
บรรทัดอนุกรมไม่ได้ใช้งานในสถานะ '1' แบบโลจิคัลดังนั้นโปรดทราบว่าคุณมี 1 ที่ด้านล่างและ 0 ที่ด้านบนที่นี่ ฉันรู้ว่าผู้คนล็อคไว้แล้ว ความคิดเห็นของฉันมีวัตถุประสงค์เพื่อชี้แนะขอบเขตในอนาคตของข้อมูลอนุกรม คุณสามารถตรวจสอบสิ่งต่าง ๆ เพื่อให้สถานะไม่ได้ใช้งานสูง
JustJeff

คำตอบ:


14

สิ่งแรกที่แลงสังเกตเห็นเช่นกัน: ระดับคือสิ่งที่ตรงกันข้ามกับสิ่งที่ไมโครคอนโทรลเลอร์มักจะส่งออก:

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

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

μμμ1μ0

0x001μ
0xFFμ

guesstimates:

0b11001111 = 0xCF
0b11110010 = 0xF2

0b11001101 = 0xCD
0b11001010 = 0xCA
0b11001010 = 0xCA
0b11110010 = 0xF2

แก้ไข
Olin ถูกต้องอย่างแน่นอนนี่คือสิ่งที่คล้าย ASCII แท้ที่จริงแล้วมันเป็นส่วนเสริมของ ASCII 1

0xCF ~ 0x30 = '0'
0xCE ~ 0x31 = '1'
0xCD ~ 0x32 = '2'
0xCC ~ 0x33 = '3'
0xCB ~ 0x34 = '4'
0xCA ~ 0x35 = '5'

0xF2 ~ 0x0D = [CR]

นี่เป็นการยืนยันว่าการตีความภาพหน้าจอของฉันถูกต้อง


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

ตัวอย่าง: ไบต์ที่สองในสกรีนช็อตที่ 1 เริ่มต้นด้วยพัลส์แคบ 2 อัน ฉันเริ่มต้นด้วยไบต์ที่สองโดยมีวัตถุประสงค์เพราะมีขอบมากกว่าในไบต์แรกดังนั้นมันจะง่ายกว่าที่จะทำให้ถูกต้อง พัลส์แคบ ๆ แต่ละอันอยู่ที่ประมาณ 1 ใน 10 ของการหารดังนั้นอาจจะสูงถึง 1 บิตในแต่ละครั้งโดยมีค่าต่ำระหว่างกัน ฉันไม่เห็นอะไรที่แคบไปกว่านี้ดังนั้นฉันคิดว่ามันน่าจะเป็นเรื่องเล็กน้อย นั่นคือการอ้างอิงของเรา
จากนั้นหลังจาก101นั้นมีระยะเวลานานในระดับต่ำ ดูกว้างประมาณสองเท่าของรุ่นก่อนหน้าดังนั้นอาจเป็น00ได้ 1111ต่อไปนี้จะสูงที่เป็นอีกครั้งที่สองครั้งที่กว้างเพื่อที่จะ ตอนนี้เรามี 9 บิต: บิตเริ่มต้น ( 1) บวก 8 บิตข้อมูล บิตถัดไปจะเป็นบิตหยุด แต่เพราะมัน0มันไม่สามารถมองเห็นได้ทันที ดังนั้นการรวมทั้งหมดเข้าด้วยกันเรามี1010011110รวมถึงการเริ่มต้นและหยุดบิต ถ้าบิตหยุดไม่เป็นศูนย์ฉันจะทำสมมุติฐานที่ไม่ดีที่ไหนสักแห่ง!
โปรดจำไว้ว่า UART ส่ง LSB (น้อยนิดอย่างมีนัยสำคัญ) ก่อนดังนั้นเราจะต้องย้อนกลับ 8 บิตข้อมูล: = 111100100xF2

ตอนนี้เรารู้ความกว้างของหนึ่งบิตสองบิตและลำดับ 4 บิตและเราดูที่ไบต์แรก ช่วงเวลาสูงครั้งแรก (พัลส์กว้าง) กว้างกว่าเล็กน้อย1111ในไบต์ที่สองเล็กน้อยดังนั้นจะกว้าง 5 บิต ต่ำและงวดต่อไปนี้มันสูงแต่ละที่กว้างเป็นบิตคู่ในไบต์อื่น ๆ 111110011เพื่อให้เราได้รับ อีก 9 บิตดังนั้นบิตถัดไปควรเป็นบิตต่ำบิตหยุด ที่ตกลงดังนั้นหาก guesstimating ของเราคือการที่ถูกต้องอีกครั้งเราสามารถย้อนกลับบิตข้อมูล: = 110011110xCF

งั้นเราก็ได้คำใบ้จากแลง การสื่อสารแรกมีความยาว 2 ไบต์สั้นกว่า 2 ไบต์ และ "0" ก็คือ 2 ไบต์ที่สั้นกว่า "255" ดังนั้นมันอาจเป็นอะไรบางอย่างที่เหมือนกับ ASCII แม้ว่าจะไม่ใช่อย่างแน่นอน ฉันยังทราบว่าไบต์ที่สองและสามของ "255" เหมือนกัน เยี่ยมมากนั่นจะเป็น "5" สองเท่า เราทำได้ดี! (คุณต้องให้กำลังใจตัวเองเป็นครั้งคราว) หลังจากถอดรหัส "0", "2" และ "5" ฉันสังเกตเห็นว่ามีความแตกต่างของ 2 ระหว่างรหัสสำหรับสองคนแรกและความแตกต่างของ 3 ระหว่างที่ผ่านมา สอง. และในที่สุดฉันก็สังเกตเห็นว่า0xC_มันคือส่วนประกอบของ0x3_ซึ่งเป็นรูปแบบของตัวเลขใน ASCII


ขอบคุณสำหรับเคล็ดลับฉันจะพยายามบันทึกรูปคลื่นที่ถูกต้องและอัปเดตคำถามของฉัน
Sean87

ขอบคุณคุณจะทำเครื่องหมายรูปภาพเหมือนที่คุณค้นหาข้อมูลเหล่านั้นหรือไม่
Sean87

1
@ Sean87 - มันกลายเป็นเรื่องยาวฉันได้เพิ่มเข้าไปในคำตอบของฉัน มันแสดงให้เห็นถึงวิธีการของฉันในการทำเช่นนี้คนอื่น ๆ อาจปฏิบัติตามเส้นทางที่แตกต่างกัน ไม่ต้องกังวลถ้าคุณคิดว่าคุณจะไม่ได้เห็นมันครึ่งหนึ่ง ส่วนใหญ่เป็นเพียงประสบการณ์และจินตนาการ ไม่มีสติปัญญาพิเศษที่เกี่ยวข้อง
stevenvh

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

7

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

ในที่สุดการนำข้อมูลนี้ไปใช้ในพีซีมันจะต้องถูกแปลงเป็นระดับ RS-232 นี่คือสิ่งที่พีซีพอร์ต COM คาดว่าจะเห็น RS-232 ต่ำและไม่ทำงานสูง แต่ต่ำกว่า -5V และสูงกว่า + 5V โชคดีที่มีชิปสำหรับสิ่งที่ทำให้ง่ายต่อการแปลงระหว่างสัญญาณ UART ระดับไมโครคอนโทรลเลอร์ทั่วไปกับ RS-232 ชิปเหล่านี้มีปั๊มสำหรับชาร์จเพื่อสร้างแรงดัน RS-232 จากแหล่งจ่ายไฟ 3.3V ของคุณ บางครั้งชิปเหล่านี้ถูกเรียกโดยทั่วไปว่า "MAX232" เพราะนั่นเป็นหมายเลขชิ้นส่วนสำหรับชิปรุ่นแรก ๆ และเป็นที่นิยม คุณต้องการตัวแปรที่แตกต่างเนื่องจากคุณใช้พลังงาน 3.3V ไม่ใช่ 5V เราสร้างผลิตภัณฑ์ที่เป็นหนึ่งในชิปเหล่านี้บนบอร์ดพร้อมตัวเชื่อมต่อ ไปที่http://www.embedinc.com/products/rslink2และดูแผนผังเพื่อดูตัวอย่างหนึ่งของการเชื่อมต่อชิปดังกล่าว

อีกสิ่งที่ไม่ได้เพิ่มคือลำดับทั้งสองดูเหมือนมากกว่าหนึ่งไบต์แม้ว่าคุณจะบอกว่าคุณกำลังส่ง 0 และ 255 เท่านั้นข้อมูลอนุกรมประเภทนี้จะถูกส่งด้วยบิตเริ่มต้นจากนั้นบิตข้อมูล 8 ตัว จากนั้นเป็นบิตหยุด บิตเริ่มต้นจะอยู่ที่ขั้วตรงข้ามเสมอจากระดับสายที่ไม่ได้ใช้งาน ในคำอธิบายส่วนใหญ่ระดับที่ไม่ได้ใช้บรรทัดจะถูกอ้างถึงเป็น "ช่องว่าง" และตรงกันข้ามกับ "เครื่องหมาย" ดังนั้นบิตเริ่มต้นจะอยู่ที่เครื่องหมายเสมอ วัตถุประสงค์ของบิตเริ่มต้นคือการจัดทำข้อมูลเวลาให้ตรงกันสำหรับบิตที่เหลืออยู่ เนื่องจากทั้งสองฝ่ายรู้ว่าบิตนานแค่ไหนคำถามเดียวก็คือเมื่อจุดเริ่มต้นของไบต์คือ บิตเริ่มต้นให้ข้อมูลนี้ ตัวรับสัญญาณเริ่มจากนาฬิกาที่ขอบนำของบิตเริ่มต้นและใช้สิ่งนั้นเพื่อทราบว่าบิตข้อมูลจะเข้ามาเมื่อใด

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

ดังนั้นจากทั้งหมดนี้คุณควรเห็นว่าร่องรอยแรกดูเหมือนว่ากำลังส่งอย่างน้อยสองไบต์และสุดท้ายอาจดูเหมือน 5

มันจะช่วยถ้าคุณขยายขอบเขตเวลาของการติดตาม ด้วยวิธีนี้คุณสามารถวัดได้ว่าเวลาจริง ๆ เป็นอย่างไร นั่นจะช่วยให้คุณสามารถตรวจสอบว่าคุณมี 9600 baud (104 /s / bit) จริง ๆ และให้คุณถอดรหัสแต่ละบิตของการจับภาพ ตามที่เป็นอยู่ในขณะนี้มีความละเอียดไม่เพียงพอที่จะดูว่าบิตอยู่ที่ไหนและดังนั้นจึงถอดรหัสสิ่งที่ถูกส่ง

ที่เพิ่ม:

ฉันเพิ่งพบว่าระบบของคุณอาจส่งข้อมูลเป็น ASCII แทนที่จะเป็นเลขฐานสอง นั่นไม่ใช่วิธีการทั่วไปที่ทำตั้งแต่การแปลงเป็น ASCII ในระบบเล็ก ๆ ใช้ทรัพยากรที่ จำกัด มากขึ้นใช้แบนด์วิดท์ไม่ดีและง่ายต่อการทำการแปลงบนพีซีถ้าคุณต้องการแสดงข้อมูลให้ผู้ใช้ อย่างไรก็ตามหากการส่งสัญญาณของคุณเป็นตัวอักษร ASCII ที่จะอธิบายว่าทำไมลำดับนั้นมีมากกว่าหนึ่งไบต์ทำไมถึงมีความยาวมากกว่า ("255" เป็นตัวละครมากกว่า "0") และทำไมทั้งคู่จึงปรากฏในไบต์เดียวกัน ไบต์สุดท้ายน่าจะเป็นจุดสิ้นสุดของอักขระบรรทัดบางตัวซึ่งโดยปกติแล้วจะเป็น carriage return หรือ line feed

อย่างไรก็ตามขยายเวลาและเราสามารถถอดรหัสสิ่งที่มันถูกส่ง


1
บิตหยุด (และตรงข้ามกับบิตเริ่มต้น) ยังบังคับให้ขอบเมื่อเริ่มการส่งใหม่
stevenvh

@steven: ใช่ฉันรู้ว่าฉันทิ้งไว้เมื่ออ่านคำตอบของฉันอีกครั้งและเพิ่มในการแก้ไขอาจในเวลาเดียวกันคุณกำลังเขียนความคิดเห็นของคุณ
Olin Lathrop

4
ในขณะที่ส่ง ASCII นั้น "ไม่มีประสิทธิภาพ" มันยังคงเป็นตัวเลือกที่ดีมาก ระบบฝังตัวของฉันส่วนใหญ่ไม่เพียง แต่ส่ง ASCII เท่านั้นพวกเขายังได้รับคำสั่ง ASCII ด้วยเช่นกันทำให้สามารถทำการทดสอบด้วยตนเองโดย "การสนทนา" กับพวกเขาจากโปรแกรมเทอร์มินัล มาตรฐาน SCPI (การปรับปรุง GPIB ซึ่งขยายไปยังส่วนต่อประสานทางไฟฟ้าอื่น ๆ ) เป็นวิธีที่เป็นทางการมากซึ่งทำงานตามแนวเหล่านี้
Chris Stratton

4
จะไม่เห็นด้วยอย่างยิ่ง Ascii รับโค้ดจำนวนเล็กน้อยเช่นนี้แม้จะใช้งานโลหะเปลือยในความขมขื่นเล็กน้อย แน่นอนว่าคุณสามารถเขียนโปรแกรมที่กำหนดเองได้ แต่จะเกิดอะไรขึ้น 10 ปีนับจากนี้เมื่อมันหายไปและจะต้องใช้เครื่องเสมือนเพื่อเรียกใช้แม้ว่ามันจะสามารถพบได้? และแน่นอนว่าโปรแกรมเมอร์คนใดที่มีค่าเกลือสามารถแฮ็กอัพเทอร์มินัลไบนารี่เพื่อทำวิศวกรรมบางอย่างได้ แต่อินเทอร์เฟซที่มนุษย์สามารถอ่านได้นั้นคุ้มค่ากับค่าใช้จ่ายเล็ก ๆ ส่วนใหญ่ แต่หน่วยความจำที่ จำกัด อย่างรุนแรงที่สุดและระบบที่มีประสิทธิภาพสูง นอกจากนี้ถ้าคุณมีหน่วยความจำคุณสามารถฝังเอาท์พุทการดีบักด้วยการเปิด / ปิด
Chris Stratton

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

1

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

หากขอบเขต Rigol ไม่มีตัวเลือกการถอดรหัสแบบอนุกรม (DSO จำนวนมากทำ) คุณสามารถใช้ X- เคอร์เซอร์เพื่อช่วยในการถอดรหัส วางเคอร์เซอร์แรกที่ขอบนำของข้อมูลและเลื่อนเคอร์เซอร์ที่สองไปทางบิตสตรีม เดลต้าระหว่างเคอร์เซอร์สามารถใช้เพื่อกำหนด 'บิต' ที่คุณกำลังโฉบอยู่ในขณะนี้ด้วยเลขคณิตอย่างง่าย ไม่ต้องสนใจบิต start / stop / parity


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