Załóżmy, że przesyłam dane przez FM, gdzie 0 to 2 Hz, a 1 to 4 Hz. Nadajnik nadaje 2 Hz, gdy nie ma sygnału wejściowego. Gdybym podał otrzymany plik binarny do portu UART mikrokontrolera, w jaki sposób mikrokontroler rozróżniałby brak danych od 0?
Staje się to istotne na przykład podczas przesyłania znaków ASCII. Załóżmy następujący ciąg:
01000110 01101111 01101111 01100010 01100001 01110010
Ponieważ dodałem spacje, możemy przetłumaczyć to na:
Foobar
Ale na maszynie łańcuch wyglądałby tak:
010001100110111101101111011000100110000101110010
Jak stworzyłbyś te „spacje”, aby nie pomieszać znaków ASCII, gdy otrzymujesz pliki binarne?
digital-logic
data
binary
Allenph
źródło
źródło
Odpowiedzi:
Jeśli podajesz coś do portu UART mikroprocesora, musisz postępować zgodnie z protokołem komunikacyjnym UART, jeśli chcesz, aby mikroprocesor zrozumiał, co go podajesz. Musisz osadzić każdy znak ASCI w pakiecie UART, który zawiera bit startu, bit stopu i ewentualnie bit parzystości, o wiele więcej informacji jest dostępnych na stronie Wikipedii UART .
Gdy nie wysyłasz, autobus jest bezczynny i jest utrzymywany w logicznie wysokim stanie. Kiedy zaczynasz transmisję pakietu, pierwszy bit jest zawsze logicznie niski. To jest bit startowy. Następnie następuje osiem bitów danych, a następnie bit stopu, który jest logicznie wysoki. Mikroprocesor wie, kiedy nadejdzie następny bit, ponieważ zna skonfigurowaną prędkość magistrali. Dlatego możliwe jest przesłanie na przykład dwóch zer obok siebie. Zarówno mikroprocesor, jak i jednostka przesyłająca do mikroprocesora muszą być skonfigurowane z tą samą prędkością transmisji, parzystością i liczbą bitów stopu.
źródło
Jest na to wiele technik. Możesz spojrzeć na kodowanie Manchester lub kody NRZ. Lub kodowanie 8b / 10b , które odwzorowuje co 8 bitów danych na 10-bitową sekwencję, która pozwala na odzyskanie zegara, korekcję błędów i specjalne symbole „przecinków”, które można wykorzystać do wykrycia początku i końca transmisji.
źródło
Wszystkie znaki ASCII mają szerokość 8 bitów, widać to w tabeli ASCII. Wartości HEX znaków ASCII nie wykraczają poza FF (1111 1111)
UART nie może odbierać więcej niż jednego bajtu danych (8 bitów) na raz, poza tymi 8-bitowymi danymi są bity STOP i START, PARITY i kilka innych, które można zobaczyć na poniższym obrazku i które razem tworzą pakiet komunikacyjny UART.
Kiedy więc wysyłasz znaki ASCII do UART, wysyłasz je jeden po drugim i tak powstaje ciąg znaków. Wiesz już, że ciąg znaków to tylko tablica znaków.
źródło
Protokół UART, jak wyjaśnił Mattias, jest protokołem asynchronicznym opartym na czasie. To, co określa granice między bitami, to czas pobierany od początku bitu początkowego. Mikrokontroler „spróbuje” bit
(N+half)/baudrate
po sekundach od rozpoczęcia bitu startowego. Pół bit jest po prostu próbkujący w środku bitów, aby mógł mieć pół-bitową różnicę w czasie między odbiornikiem a nadajnikiem (pamiętaj, że różnice kumulują się, a najgorszy przypadek występuje w ostatnim bicie każdej ramki, co zwykle jest ale nie zawsze, szerokość 8 bitów, w zależności od konfiguracji). Kluczem do tego, aby działał, jest jak najbliższy odbiornik i nadajnik-odbiornik z szybkościami transmisji.Mikrokontroler zlicza czas między poszczególnymi bitami, aby wiedzieć, gdzie każdy bit znajduje się w ramce. Następna postać przejdzie do następnej klatki. Kiedy kończy się każda ramka, mikrokontroler zaczyna automatycznie nasłuchiwać następnej ramki, więc kiedy nadchodzi następny bit startowy, już wie, że powinien rozpocząć nową ramkę. W ten sposób rozdzielane są postacie.
Dodatkowo dodam, że tak naprawdę nie potrzebujesz dwóch częstotliwości do transmisji do mikrokontrolera odbierającego UART. Możesz użyć pojedynczej częstotliwości jako OOK zamiast dwóch częstotliwości jako FSK . Ma wyższą efektywność widmową, a obwody są znacznie prostsze, ponieważ potrzebujesz jedynie przełącznika fali nośnej jako nadajnika i pojedynczego detektora częstotliwości jako odbiornika, podobnie jak kod Morse'a. Pamiętaj, aby na ogół używać nośnych o częstotliwościach znacznie wyższych niż szybkość transmisji, w przeciwnym razie prostsze obwody nie będą działać poprawnie.
źródło