Pertama, sesuatu yang diperhatikan Olin: levelnya adalah kebalikan dari apa yang biasanya dihasilkan oleh mikrokontroler:
Tidak perlu khawatir, kita akan melihat bahwa kita juga bisa membacanya. Kita hanya harus ingat bahwa pada lingkup bit awal akan menjadi 1
dan bit berhenti 0
.
μμμ1
μ0
0x00
1
μ
0xFF
μ
tebak waktu:
0b11001111 = 0xCF
0b11110010 = 0xF2
0b11001101 = 0xCD
0b11001010 = 0xCA
0b11001010 = 0xCA
0b11110010 = 0xF2
sunting
Olin benar sekali, ini seperti ASCII. Sebenarnya ini adalah pelengkap 1 dari ASCII.
0xCF ~ 0x30 = '0'
0xCE ~ 0x31 = '1'
0xCD ~ 0x32 = '2'
0xCC ~ 0x33 = '3'
0xCB ~ 0x34 = '4'
0xCA ~ 0x35 = '5'
0xF2 ~ 0x0D = [CR]
Ini menegaskan bahwa interpretasi saya atas tangkapan layar itu benar.
sunting 2 (bagaimana saya menginterpretasikan data, atas permintaan populer :-))
Peringatan: ini adalah cerita yang panjang, karena ini adalah transkrip dari apa yang terjadi di kepala saya ketika saya mencoba untuk memecahkan kode hal seperti ini. Bacalah hanya jika Anda ingin belajar satu cara untuk mengatasinya.
Contoh: byte kedua pada tangkapan layar 1, dimulai dengan 2 pulsa sempit. Saya mulai dengan byte kedua secara sengaja karena ada lebih banyak tepi daripada di byte pertama, sehingga akan lebih mudah untuk memperbaikinya. Masing-masing pulsa sempit sekitar 1/10 divisi, sehingga mungkin masing-masing 1 bit tinggi, dengan bit rendah di antaranya. Saya juga tidak melihat sesuatu yang lebih sempit dari ini, jadi saya rasa ini sedikit. Itu referensi kami.
Kemudian, setelah 101
ada periode yang lebih lama di level rendah. Terlihat sekitar dua kali lebih lebar dari yang sebelumnya, sehingga bisa jadi 00
. Pengikut tinggi yang lagi dua kali lebih lebar, sehingga akan menjadi 1111
. Kami sekarang memiliki 9 bit: bit mulai ( 1
) ditambah 8 bit data. Jadi bit selanjutnya akan menjadi bit stop, tetapi karena itu bit0
itu tidak segera terlihat. Jadi, satukan semuanya yang kita miliki 1010011110
, termasuk mulai dan berhenti sedikit. Jika bit stop tidak menjadi nol, saya akan membuat asumsi yang buruk di suatu tempat!
Ingatlah bahwa UART mengirim LSB (bit paling signifikan) terlebih dahulu, jadi kami harus membalikkan 8 bit data: 11110010
= 0xF2
.
Kita sekarang tahu lebar bit tunggal, bit ganda dan urutan 4 bit, dan kita lihat byte pertama. Periode tinggi pertama (pulsa lebar) sedikit lebih lebar dari 1111
pada byte kedua, sehingga akan menjadi lebar 5 bit. Periode rendah dan tinggi yang mengikutinya masing-masing selebar bit ganda di byte lain, jadi kita dapatkan 111110011
. Sekali lagi 9 bit, jadi yang berikutnya harus sedikit, stop bit. Tidak apa-apa, jadi jika tebakan tebakan kami benar kami dapat kembali membalikkan bit data: 11001111
= 0xCF
.
Lalu kami mendapat petunjuk dari Olin. Komunikasi pertama panjangnya 2 byte, lebih pendek 2 byte dari yang kedua. Dan "0" juga 2 byte lebih pendek dari "255". Jadi itu mungkin sesuatu seperti ASCII, meskipun tidak persis. Saya juga mencatat bahwa byte kedua dan ketiga dari "255" adalah sama. Hebat, itu akan menjadi ganda "5". Kami baik-baik saja! (Anda harus mendorong diri Anda sendiri dari waktu ke waktu.) Setelah menguraikan kode "0", "2" dan "5" Saya perhatikan ada perbedaan 2 antara kode untuk dua yang pertama, dan perbedaan 3 antara yang terakhir dua. Dan akhirnya saya perhatikan bahwa itu 0xC_
adalah pelengkap dari 0x3_
, yang merupakan pola untuk digit di ASCII.