İlk olarak Olin'in de fark ettiği bir şey: seviyeler, bir mikrokontrolörün genellikle çıktısının tersidir:
Endişelenecek bir şey yok, onu da bu şekilde okuyabileceğimizi göreceğiz. Sadece kapsamda bir başlangıç bitinin bir 1
ve bitiş biti olacağını hatırlamak zorundayız 0
.
μμμ1
μ0
0x00
1
μ
0xFF
μ
guesstimates:
0b11001111 = 0xCF
0b11110010 = 0xF2
0b11001101 = 0xCD
0b11001010 = 0xCA
0b11001010 = 0xCA
0b11110010 = 0xF2
düzenlemek
Olin is right right, this ASCII gibi bir şey. Nitekim ASCII'nin 1'in tamamlayıcısıdır .
0xCF ~ 0x30 = '0'
0xCE ~ 0x31 = '1'
0xCD ~ 0x32 = '2'
0xCC ~ 0x33 = '3'
0xCB ~ 0x34 = '4'
0xCA ~ 0x35 = '5'
0xF2 ~ 0x0D = [CR]
Bu, ekran görüntüleri hakkındaki yorumumun doğru olduğunu onaylar.
edit 2 (popüler istek üzerine verileri nasıl yorumladığım :-))
Uyarı: Bu uzun bir hikaye, çünkü böyle bir şeyi çözmeye çalıştığımda kafamda ne olduğunun bir transkripti. Sadece bununla başa çıkmanın bir yolunu öğrenmek istiyorsanız okuyun.
Örnek: 2 dar darbeden başlayarak 1. ekran görüntüsünde ikinci bayt. İkinci bayt ile bilerek başladım çünkü ilk bayttan daha fazla kenar var, bu yüzden doğru yapmak daha kolay olacak. Dar darbelerin her biri, bir bölümün yaklaşık 1 / 10'u kadardır, bu nedenle, her biri 1 bit yüksek, aralarında düşük bir bit olabilir. Ayrıca bundan daha dar bir şey görmüyorum, bu yüzden sanırım tek bir parça. Bizim referansımız bu.
Sonra, 101
düşük seviyede daha uzun bir süre sonra. Öncekilerden iki kat daha geniş görünüyor, öyle olabilir 00
. Yüksek takip, yine iki kat daha geniş, öyle olacak 1111
. Şimdi 9 bitimiz var: bir başlangıç biti ( 1
) artı 8 veri biti. Bir sonraki bit stop biti olacak, çünkü0
hemen görünmez. Yani hepsini bir araya getirmek 1010011110
, başlangıç ve bitiş biti dahil. Dur biti sıfır olmasaydı, bir yerde kötü bir varsayım yapardım!
Bir UART'ın önce LSB'yi (en az anlamlı bit) gönderdiğini unutmayın, bu nedenle 8 veri bitini tersine çevirmek zorunda kalacağız: 11110010
= 0xF2
.
Şimdi tek bir bitin, bir çift bitin ve 4 bitlik bir dizinin genişliğini biliyoruz ve ilk bayta bir göz atıyoruz. İlk yüksek periyot (geniş puls) 1111
ikinci bayttan biraz daha geniştir , bu yüzden 5 bit genişliğinde olacaktır. Her birini takip eden düşük ve yüksek dönem, diğer bayttaki çift bit kadar geniştir, bu yüzden elde ederiz 111110011
. Yine 9 bit, bu yüzden bir sonraki düşük bit, dur biti olmalıdır. Tamam, eğer tahminimiz doğruysa veri bitlerini tekrar tersine çevirebiliriz: 11001111
= 0xCF
.
Sonra Olin'den bir ipucu aldık. İlk iletişim 2 bayt uzunluğunda, 2 bayt ikinciden daha kısadır. Ve "0" da "255" den 2 bayt daha kısadır. Yani muhtemelen tam olarak olmasa da ASCII gibi bir şey. Ayrıca "255" ün ikinci ve üçüncü baytlarının aynı olduğunu da not ediyorum. Harika, bu çift "5" olacak. Biz iyiyiz! (Zaman zaman kendinizi cesaretlendirmelisiniz.) "0", "2" ve "5" kodlarını çözdükten sonra, ilk ikisinin kodları arasında 2 ve sonuncusu arasında 3 fark olduğunu fark ettim. iki. Ve nihayet ASCII'deki rakamların paterni olan 0xC_
tamamlayıcı olduğunu fark ettim 0x3_
.