Đầu tiên, một điều mà Olin cũng nhận thấy: các cấp độ là mặt trái của những gì một vi điều khiển thường tạo ra:
Không có gì phải lo lắng, chúng ta sẽ thấy rằng chúng ta cũng có thể đọc nó theo cách này. Chúng ta chỉ cần nhớ rằng trên phạm vi, bit start sẽ là 1
bit dừng và bit dừng 0
.
μμμ1
μ0
0x00
1
μ
0xFF
μ
guesstimates:
0b11001111 = 0xCF
0b11110010 = 0xF2
0b11001101 = 0xCD
0b11001010 = 0xCA
0b11001010 = 0xCA
0b11110010 = 0xF2
chỉnh sửa
Olin là hoàn toàn đúng, đây là một cái gì đó giống như ASCII. Thực tế, đây là phần bổ sung của ASCII.
0xCF ~ 0x30 = '0'
0xCE ~ 0x31 = '1'
0xCD ~ 0x32 = '2'
0xCC ~ 0x33 = '3'
0xCB ~ 0x34 = '4'
0xCA ~ 0x35 = '5'
0xF2 ~ 0x0D = [CR]
Điều này xác nhận rằng giải thích của tôi về ảnh chụp màn hình là chính xác.
chỉnh sửa 2 (cách tôi diễn giải dữ liệu, theo yêu cầu phổ biến :-))
Cảnh báo: đây là một câu chuyện dài, bởi vì đó là bản ghi lại những gì xảy ra trong đầu tôi khi tôi cố gắng giải mã một điều như thế này. Chỉ đọc nó nếu bạn muốn tìm hiểu một cách để giải quyết nó.
Ví dụ: byte thứ hai trên ảnh chụp màn hình thứ 1, bắt đầu bằng 2 xung hẹp. Tôi bắt đầu với byte thứ hai trên mục đích vì có nhiều cạnh hơn trong byte đầu tiên, vì vậy sẽ dễ dàng hơn để làm cho đúng. Mỗi xung hẹp là khoảng 1/10 của một phân chia, do đó, mỗi xung có thể cao 1 bit, với một bit thấp ở giữa. Tôi cũng không thấy bất cứ điều gì hẹp hơn thế này, vì vậy tôi đoán đó là một chút. Đó là tài liệu tham khảo của chúng tôi.
Sau đó, sau 101
một khoảng thời gian dài hơn ở mức thấp. Nhìn rộng gấp đôi so với những cái trước, vì vậy có thể được 00
. Cao theo sau đó là rộng gấp đôi, vì vậy sẽ được 1111
. Bây giờ chúng ta có 9 bit: một bit start ( 1
) cộng với 8 bit dữ liệu. Vì vậy, bit tiếp theo sẽ là bit stop, nhưng bởi vì nó0
nó không thể nhìn thấy ngay lập tức. Vì vậy, đặt tất cả chúng ta lại với nhau 1010011110
, bao gồm bit start và stop. Nếu bit stop không bằng 0, tôi đã có một giả định tồi ở đâu đó!
Hãy nhớ rằng UART gửi LSB (bit có ý nghĩa nhỏ nhất) trước tiên, vì vậy chúng tôi sẽ phải đảo ngược 8 bit dữ liệu: 11110010
= 0xF2
.
Bây giờ chúng ta biết chiều rộng của một bit đơn, một bit kép và chuỗi 4 bit và chúng ta đã xem xét byte đầu tiên. Chu kỳ cao đầu tiên (xung rộng) rộng hơn một chút so với 1111
byte thứ hai, do đó sẽ rộng 5 bit. Mỗi khoảng thời gian thấp và cao theo sau nó đều rộng bằng bit kép trong byte khác, vì vậy chúng tôi nhận được 111110011
. Lại 9 bit, do đó, bit kế tiếp nên là bit thấp, bit stop. Điều đó không sao, vì vậy nếu dự đoán của chúng tôi là chính xác, chúng tôi lại có thể đảo ngược các bit dữ liệu: 11001111
= 0xCF
.
Sau đó, chúng tôi đã nhận được một gợi ý từ Olin. Giao tiếp đầu tiên dài 2 byte, ngắn hơn 2 byte so với lần thứ hai. Và "0" cũng ngắn hơn 2 byte so với "255". Vì vậy, nó có thể là một cái gì đó giống như ASCII, mặc dù không chính xác. Tôi cũng lưu ý rằng byte thứ hai và thứ ba của "255" là như nhau. Tuyệt vời, đó sẽ là gấp đôi "5". Chúng tôi đang làm tốt! (Thỉnh thoảng bạn phải tự động viên mình.) Sau khi giải mã "0", "2" và "5" Tôi nhận thấy rằng có sự khác biệt 2 giữa các mã cho hai mã đầu tiên và chênh lệch 3 giữa các mã cuối cùng hai. Và cuối cùng tôi nhận thấy đó 0xC_
là phần bổ sung của 0x3_
, đó là mẫu cho các chữ số trong ASCII.