ช่วยด้วยหรือคำแนะนำในการถอดรหัสโปรโตคอล IR


10

เมื่อไม่นานมานี้ฉันซื้อเฮลิคอปเตอร์ของเล่นเล็ก ๆ ราคาประหยัดที่เรียบง่ายและราคาถูก (เหมือนอย่างนี้ - เรียกว่า "Diamond Gyro" หรือ "Diamond Force") เพื่อความสนุกฉันได้พยายามควบคุมมันผ่าน Arduino

อัปเดต: เตรียมพร้อมรับโพรโทคอลแล้ว ดูคำตอบ

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

เหมือนในลิงค์ที่ 2 ด้านบนฉันแยกคอนโทรลเลอร์ออกจากกันโดยตั้งที่ขา IC ควบคุมไฟ LED (เครื่องหมายของ IC ถูกลบไปแล้ว) และเชื่อมต่อเครื่องวิเคราะห์ตรรกะ

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

ดังนั้นฉันขอขอบคุณแนวคิดที่คุณอาจมี บางทีฉันแค่มองมันผิด
(ข้อมูลเพิ่มเติมด้านล่างภาพ)

ตัวอย่างจากช่อง A

ลักษณะสัญญาณ / โปรโตคอล

ฉันบันทึกสิ่งนี้ที่ 16MHz ด้วยชุดควบคุมที่ตั้งไว้ที่ช่อง A ควรแม่นยำถูกเวลา (มี IR 3 ช่องที่คุณสามารถเลือกได้ แต่การใช้อีกสองช่องจะไม่เปลี่ยนคุณสมบัติ แต่เป็นเพียงบางส่วนของแพ็กเก็ตเท่านั้น) การจับเวลามีความสอดคล้องกันมาก (+/- สูงสุด 10µs) แพ็คเก็ตจะถูกทำซ้ำตามช่วงเวลาที่แตกต่างกัน แต่อย่างน้อยก็อยู่ห่างกันประมาณ 100ms

ผู้ให้บริการ: 38kHz @ 50% รอบการทำงาน

ต่ำ:
- สั้น: 285µs
- ยาว: 795µs

เสียงสูง:
- สั้น: 275µs
- ยาว: 855µs

สูง 17 ต่อแพ็คเก็ตเสมอ

การควบคุม / ปัจจัยการผลิต

Heli มีการควบคุม 3 แบบ: "Throttle" (เช่นความเร็วในการยก / โรเตอร์), ระยะพิท (ไปข้างหน้า / หลัง) และหันเห (หมุนรอบแกนโรเตอร์) ทั้งหมดควบคุมด้วย 2 thumbsticks พวกเขาทุกคนมีช่วงบางอย่าง (ไม่ใช่แค่เปิด / ปิด) และเท่าที่ฉันสามารถบอกได้ทั้งหมดถูกส่งในแพ็คเก็ตเดียว อินพุตซ้าย / ขวาจะถูกส่งก็ต่อเมื่อมีสิ่งอื่นที่กำลังส่งอยู่ดังนั้นฉันจึงใช้การเร่งความเร็วสูงสุดเมื่อสุ่มตัวอย่าง การป้อนข้อมูลคันเร่งและพิทช์ในแพ็คเก็ตไกของมันเองที่ถูกส่งทันทีที่คุณกด thumbsticks ผ่านขีด จำกัด / เดดแบนด์บางอัน (ในกราฟด้านล่างฉลาก "min" สำหรับแพ็คเก็ตแรกที่ส่งเมื่อค่อยๆผลักตัวควบคุม

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


ทำไมไม่ใช้เพียงแค่ร่องรอยสัญญาณที่คุณต้องเขียนแพ็กเก็ตดิบ?
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams คุณหมายถึงแค่เล่นสัญญาณที่บันทึกไว้ไปยังเฮลิคอปเตอร์อีกครั้งหรือไม่
Flambino

แน่ใจ มันไม่เหมือนเฮลิคอปเตอร์ที่จะสามารถบอกความแตกต่าง ...
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams จริงแต่เท่าที่ฉันสามารถบอกได้แพ็คเก็ตมีการควบคุมทั้ง 3 (throttle / pitch / yaw) และการควบคุมของ heli ไม่มีใครเป็นเพียงแค่เปิด / ปิด เพื่อคัดท้ายสิ่งโดย replaying ฉันต้องจับทุกการกำหนดค่า ... นอกจากนี้ฉันต้องการที่จะเข้าใจโปรโตคอล
Flambino

@ IgnacioVazquez-Abrams โอ๊ะโอฉันไม่เห็นด้วยกับความคิดเห็นล่าสุดของฉัน หมายถึง: "... แพ็คเก็ตมีการควบคุมทั้งหมด 3 ตัว (throttle / pitch / yaw) และไม่มีการเปิด / ปิด"
Flambino

คำตอบ:


8

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


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


ฉันต้องลองทำสิ่งที่แตกต่างออกไปเพื่อให้ได้สิ่งนี้ แต่ฉันค่อนข้างมั่นใจว่าฉันได้รับมัน ผิดปกติฉันไม่พบสิ่งใดที่คล้ายกับโปรโตคอลนี้ที่อื่น แต่อาจเป็นโปรโตคอลทั่วไปที่ฉันเพิ่งไม่รู้

อย่างไรก็ตามนี่คือสิ่งที่ฉันได้พบ:

พิธีสาร / การเข้ารหัส

ทั้งพัลส์และช่องว่างที่อยู่ระหว่างนั้นถูกใช้เพื่อเข้ารหัสข้อมูล พัลส์ยาว / อวกาศคือไบนารีหนึ่ง (1) และพัลส์สั้น / อวกาศคือไบนารีศูนย์ (0) พัลส์จะถูกส่งโดยใช้การปรับ 38kHz อินฟราเรดของผู้ใช้มาตรฐาน @ 50% รอบการทำงาน

การกำหนดเวลาพัลส์ / สเปซอยู่ในคำถามเดิม แต่ฉันจะทำซ้ำที่นี่เพื่อความสมบูรณ์:

 Bit    Pulse     Space
-----+---------+---------
  0  |  275µs  |  285µs
  1  |  855µs  |  795µs

ค่าสูงสุด± 10 max, ± 5 ทุกประเภท .. นี่คือตัวอย่างที่จับด้วยเครื่องวิเคราะห์ตรรกะที่ 16MHz; ฉันไม่มีออสซิลโลสโคปดังนั้นฉันจึงไม่ทราบโปรไฟล์ที่แน่นอน (เช่นเวลาขึ้น / ลง)

แพ็คเก็ตจะทำซ้ำตราบใดที่มีการใช้อินพุตควบคุมและดูเหมือนว่าจะเว้นระยะห่างกันอย่างน้อย 100ms

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

แต่ละแพ็คเก็ตมีความยาว 32 บิตและมีอินพุตทุกตัวที่รีโมทสามารถจัดเตรียมได้ ค่าจะถูกอ่านเป็น endian น้อยเช่น MSB ก่อน

โครงสร้างข้อมูล

ด้านล่างเป็นโครงสร้างพื้นฐานของแต่ละแพ็กเก็ต 8 บิตสุดท้ายทำให้ฉันสับสน แต่ตอนนี้ได้รับการคิดออก (ดูด้านล่าง)

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
--+---------------------------+-----------+---+-------+-----------
 P|    Yaw    |   Throttle    |   Pitch   | T | Chan. |   Check

P: Preamble (always a pulse-1), T: Trim, Chan.: Channel

Bit    Length    Description (see note below)
-----------------------------------------------
0      1         Preamble. High 1
1-6    6         Yaw. Range 0-36 for left-right, 17 being neutral
7-14   8         Throttle. Range 0-134
15-20  6         Pitch. Range 0-38 for forward-back, 17 being neutral
21-22  2         Trim. Left = 1, right = 2, no trim = 0
23-26  4         Channel. A = 5, B = 2, C = 8
27-32  6         Check bits

หมายเหตุ:ช่วงขึ้นอยู่กับการอ่านสูงสุดที่ฉันได้รับ โปรโตคอลมีความสามารถในช่วงที่ใหญ่กว่า - มากถึง 255 สำหรับเค้น, 63 สำหรับระยะห่าง / หันเห - แต่ปิดที่ประมาณครึ่งหนึ่ง
ดูเหมือนว่าจะมีค่าพิทช์ตายจาก 14-21 (รวม); เฉพาะค่าที่สูงหรือต่ำกว่าที่จริงเท่านั้นที่ทำให้เฮลิคอปเตอร์ตอบสนอง ฉันไม่รู้ว่ามันเหมือนกันกับการหันเหหรือไม่ (ยากที่จะบอกเพราะเฮลิคอปเตอร์นั้นไม่เสถียรอยู่ดีและอาจหมุนด้วยตัวเองเล็กน้อย)

ที่นี่มันอยู่ในรูปแบบกราฟิก (เปรียบเทียบกับกราฟิกในคำถามเดิม)

โครงสร้างแพ็กเก็ต

บิตตรวจสอบ 6 บิตถูกคำนวณโดย XOR'ing ค่าก่อนหน้าทั้งหมด แต่ละค่าถือว่าเป็น 6 บิต ซึ่งหมายความว่า 2 MSBs ของค่าเค้นแบบ 8 บิตจะถูกละเว้นเพียงแค่ กล่าวคือ

check = yaw ^ (throttle & 0x3F) ^ pitch ^ trim ^ channel

บันทึกการปฏิบัติ

การกำหนดเวลาและการปรับสัญญาณไม่จำเป็นต้องแม่นยำมากนัก แม้แต่จังหวะเวลาที่ไม่แม่นยำของ Arduino ของฉันก็ยังทำงานได้ดีแม้จะมีการมอดูเลชั่นหลบและจังหวะและจังหวะการเต้นของชีพจร / พื้นที่เล็กน้อยเมื่อเทียบกับรีโมทจริง

ฉันเชื่อว่า - แต่ยังไม่ได้ทดสอบ - ว่าเฮลิคอปเตอร์จะยึดติดกับช่องสัญญาณแรกที่พบ หากถูกทิ้งไว้โดยไม่มีสัญญาณนานเกินไป (สองสามวินาที) มันจะกลับไปที่โหมด "ค้นหา" จนกว่าจะได้รับสัญญาณอีกครั้ง

เฮลิคอปเตอร์จะไม่สนใจค่า pitch และ yaw หาก throttle เป็นศูนย์

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

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

LED IR ของรีโมทคอนโทรลดั้งเดิมนั้นมีความยาวคลื่น> 900nm แต่ฉันไม่มีปัญหาในการใช้ LED ~ 850nm

ตัวรับสัญญาณ IR ของเฮลิคอปเตอร์นั้นใช้ได้ แต่ไม่ไวต่อแสงมากนัก รีโมตคอนโทรลใช้ไฟ LED 3 ดวงในซีรีย์นั่งอยู่บนราง 9V แทนราง 5V ที่ใช้โดยลอจิก ยังไม่ได้ตรวจสอบการวาดในปัจจุบันของพวกเขาอย่างแม่นยำ แต่ฉันจะเดิมพัน 50mA

ข้อมูลตัวอย่าง

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

Channel A                                                       
Yaw     Throttle  Pitch   Tr  Chan  Check     Description
-----------------------------------------------------------
000100  10000100  000000  00  0101  000101    Left Mid + Throttle
000000  10000110  010001  00  0101  010010    Left Max + Throttle 
100001  10000110  000000  00  0101  100010    Right Mid + Throttle 
100100  10000100  010001  00  0101  110100    Right Max + Throttle
010001  00000000  001011  00  0101  011111    Forward Min 
010001  00000000  000000  00  0101  010100    Forward Max 
010001  00000000  011000  00  0101  001100    Back Min 
010001  00000000  100101  00  0101  110001    Back Max
010001  00000000  010001  01  0101  010101    Left Trim 
010001  00000000  010001  10  0101  100101    Right Trim 
010001  00000011  010001  00  0101  000110    Throttle 01 (min)
010001  00010110  010001  00  0101  010011    Throttle 02
010001  00011111  010001  00  0101  011010    Throttle 03
010001  00101111  010001  00  0101  101010    Throttle 04
010001  00111110  010001  00  0101  111011    Throttle 05
010001  01010101  010001  00  0101  010000    Throttle 06
010001  01011111  010001  00  0101  011010    Throttle 07
010001  01101100  010001  00  0101  101001    Throttle 08
010001  01111010  010001  00  0101  111111    Throttle 09
010001  10000101  010001  00  0101  000000    Throttle 10 (max)

Channel B
Yaw     Throttle  Pitch   Tr  Chan  Check     Description
-----------------------------------------------------------
000000  10000110  010001  00  0010  010101    Left Max + Throttle 
100100  10000110  010001  00  0010  110001    Right Max + Throttle 
010001  00000000  001001  00  0010  011010    Forward Min 
010001  00000000  000000  00  0010  010011    Forward Max 
010001  00000000  010111  00  0010  000100    Back Min 
010001  00000000  100110  00  0010  110101    Back Max
010001  00000000  010001  01  0010  010010    Left Trim 
010001  00000000  010001  10  0010  100010    Right Trim 
010001  00000001  010001  00  0010  000011    Throttle Min 
010001  00110100  010001  00  0010  110110    Throttle Mid 
010001  01100111  010001  00  0010  100101    Throttle High 
010001  10001111  010001  00  0010  001101    Throttle Max 

Channel C
Yaw     Throttle  Pitch   Tr  Chan  Check     Description
-----------------------------------------------------------
000000  10000101  010001  00  1000  011100    Left Max + Throttle 
100100  10000101  010001  00  1000  111000    Right Max + Throttle 
010001  00000000  001010  00  1000  010011    Forward Min 
010001  00000000  000000  00  1000  011001    Forward Max 
010001  00000000  010111  00  1000  001110    Back Min 
010001  00000000  100110  00  1000  111111    Back Max
010001  00000000  010001  01  1000  011000    Left Trim 
010001  00000000  010001  10  1000  101000    Right Trim 
010001  00000001  010001  00  1000  001001    Throttle Min 
010001  00110100  010001  00  1000  111100    Throttle Mid 
010001  01100110  010001  00  1000  101110    Throttle High 
010001  10000101  010001  00  1000  001101    Throttle Max

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

8 บิตสุดท้าย

แพ็คเก็ต 8 บิตสุดท้ายยังคงเป็นปริศนา

4 บิตจากบิต 23 ถึง 26 ทั้งหมดดูเหมือนว่าถูกกำหนดโดยการตั้งค่าช่องสัญญาณของรีโมทคอนโทรล การเปลี่ยนช่องสัญญาณบนรีโมตคอนโทรลไม่ได้เป็นการเปลี่ยนแปลงโปรโตคอลหรือการปรับ แต่อย่างใด มันเปลี่ยนเพียง 4 บิตเหล่านั้น

แต่ 4 บิตเป็นสองเท่าสิ่งที่จำเป็นในการเข้ารหัสการตั้งค่าช่องสัญญาณ มีเพียงสามช่องเท่านั้นดังนั้น 2 บิตจึงมีมากมาย ดังนั้นในคำอธิบายโครงสร้างข้างต้นฉันได้ติดป้าย 2 บิตแรกเป็น "Channel" และเหลืออีกสองบิตที่มีป้ายกำกับว่า "X" แต่นี่เป็นการคาดเดา

ด้านล่างนี้เป็นตัวอย่างของบิตที่เกี่ยวข้องสำหรับการตั้งค่าแต่ละช่อง

Chan.   Bits 23-26
-----+-------------
  A  |  0  1  0  1
  B  |  0  0  1  0
  C  |  1  0  0  0

โดยทั่วไปมี 2 บิตมากกว่าที่จำเป็นต้องมีเพื่อส่งการตั้งค่าช่อง บางทีโปรโตคอลมีการตั้งค่าไว้ 4 บิตเพื่อให้มีช่องสัญญาณเพิ่มเติมในภายหลังหรือดังนั้นโปรโตคอลสามารถใช้กับของเล่นที่แตกต่างกันโดยสิ้นเชิง แต่ฉันไม่รู้ สำหรับค่าที่ใหญ่กว่าโปรโตคอลจะใช้บิตพิเศษที่อาจถูกปล่อยออกมา (หันเห / คันเร่ง / ระยะห่างอาจทำได้น้อยกว่าละเล็กน้อย) แต่สำหรับการตัดแต่ง - ซึ่งมี 3 สถานะ - ใช้เพียง 2 บิตเท่านั้น ดังนั้นใคร ๆ ก็สงสัยว่าช่องนั้นก็แค่ 2 บิต แต่นั่นก็ทำให้ 2 อันถัดไปที่ไม่ได้รับการรับรอง

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

และพูดถึง: ฉันไม่รู้เลยว่าบิตเช็คเหล่านั้นเกิดขึ้นได้อย่างไร ฉันหมายถึงพวกมันคือบิตตรวจสอบเนื่องจากพวกมันไม่สอดคล้องกับอินพุตควบคุมเดี่ยวใด ๆ และเฮลิคอปเตอร์ดูเหมือนจะไม่ตอบสนองหากฉันเล่นซอกับพวกเขา ฉันเดาว่าเป็น CRC บางอย่าง แต่ฉันไม่สามารถเข้าใจมันได้ การตรวจสอบมีความยาว 6-8 บิตขึ้นอยู่กับวิธีที่คุณตีความ "X bits" ดังนั้นจึงมีหลายวิธีที่สามารถนำมารวมกันได้


6

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

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

ลองเรียกยาว 1 และสั้น a 0 อาจเป็นวิธีอื่น ๆ แต่เราต้องเริ่มต้นที่ไหนสักแห่ง การถอดบิตเริ่มต้นออก:

คันเร่ง 1010001101011010 นาที
เค้นสูงสุด 1010011101011000
ไปข้างหน้า 1010000001011111 นาที
ไปข้างหน้าสูงสุด 1010000000011110
1010000011011101 สูงสุดด้านหลัง
1010000100011010 นาทีกลับ
0000010101011100 สูงสุดซ้าย + เค้นสูงสุด
0100010101011110 สูงสุดขวา + เค้นสูงสุด
1010000101111111 เล็มซ้าย
1010000101011011 ตัดขวา

บางสิ่งโผล่ออกมาทันที เห็นได้ชัดว่าบิต 0 เป็นบิตพาริตี้ มิฉะนั้นจะปรากฏเป็นฟิลด์ 3 บิต <15:13>, ค่าข้อมูล 8 บิต <12: 5> และอีก 4 บิตฟิลด์ <4: 1>

ดูเหมือนว่าค่าข้อมูลจะถูกส่งในลำดับต่ำถึงสูงดังนั้นจึงอาจเหมาะสมกว่าที่จะตีความทั้ง 16 บิตที่พลิกจากสิ่งที่ฉันแสดง

ฉันไม่รู้สึกอยากใช้เวลากับเรื่องนี้มากขึ้น แต่หวังว่านี่จะทำให้คุณเริ่มต้นได้ ฉันจะดำเนินการต่อโดยเขียนรายการข้างต้นอีกครั้งด้วยการถอดพาริตี้บิตจำนวนทั้งหมดพลิก LSB ไปที่ MSB และแต่ละฟิลด์สันนิษฐานแสดงแยกต่างหากโดยมีช่องว่างระหว่างมันกับเขตจด ที่อาจทำให้คุณโผล่ออกมามากขึ้น โปรดทราบว่าเราอาจมีความรู้สึก 1/0 ของแต่ละบิตย้อนหลัง บางทีเขียนตารางใหม่แต่ละวิธีและดูว่ามีอะไรที่สมเหตุสมผลมากกว่าหรือไม่


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

อืมมม ... เท่าที่ผมสามารถบอกได้พื้นที่ทำเรื่อง ฉันเพ่งความสนใจไปที่เค้นและจับตัวอย่างเพิ่มเติมที่ตำแหน่งเค้นที่แตกต่างกัน 10 ตำแหน่ง การยกเว้นช่องว่างทำให้ฉันไม่มีตัวเลขที่มีความหมายไม่ว่าฉันจะทำ Conversion อย่างไร แต่รวมพวกเขาเป็นเวลานาน = 1 สั้น = 0 ให้ความก้าวหน้าที่ราบรื่นของค่าเค้นตั้งแต่ 1 ถึง 134 (endian น้อย) ยังคงทำงานกับพารามิเตอร์อื่น ๆ
Flambino

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

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

สุจริตเป็นส่วนใหญ่ทดลองใช้และข้อผิดพลาดในส่วนของฉัน เนื่องจากการกำหนดเวลา 2 รายการที่ใช้สำหรับช่องว่างนั้นเหมือนกับการจับเวลาชีพจรฉันคิดว่าพวกเขาอาจมีความหมาย และเมื่อละเว้นการเว้นวรรคไม่ได้ให้ข้อมูลไบนารีที่มีประโยชน์ฉันแค่คิดว่า pulse long = 1 และ long space = 1 (และ short space / pulse = 0) ซึ่งให้ข้อมูลที่เป็นประโยชน์แก่ฉันทันที ดังนั้นช่องว่างแรกหลังจากชีพจรเริ่มต้นคือบิตแรก (กราฟขวาสูงสุด + สูงสุดเค้นแสดงให้เห็นว่า "ช่องว่าง 1" เป็นบิตแรก) ตามด้วย 16 พัลส์พร้อมช่องว่างอีก 15 ช่องระหว่างนั้น 32 บิต
Flambino
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.