Czy unikasz pomyłki między brakiem danych wejściowych a zerowym wartością binarną?

10

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?

Allenph
źródło
5
Oto jak UART to rozwiązuje, link . Zatrzymaj i uruchom bity, ponieważ zou podajesz je do portu UART, więc powinieneś je również przesłać.
Bence Kaulics
Obawiam się, że nie do końca rozumiem twój schemat. Wygląda na to, że „bit startowy” ma po prostu zero, co przywraca mój problem. Na przykład, skąd miałaby znać różnicę między 01111000 a 00111100, gdyby ciąg wynosił 000 01111000 000?
Allenph
2
@Allenph, kiedy 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. Zarówno mikroprocesor, jak i jednostka przesyłająca do mikroprocesora muszą być skonfigurowane z tą samą prędkością transmisji.
Mattias Johansson

Odpowiedzi:

16

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.

Mattias Johansson
źródło
2
Kluczową kwestią jest to, że skonfigurowana liczba bitów stopu jest minimalna, a nie maksymalna. Stan bezczynności linii szeregowej asynchronicznej jest rozszerzonym bitem stopu. Jeśli więc radio musi być bezczynne przy 0, wówczas najłatwiejszą odpowiedzią jest odwrócenie wyjścia UART przed prowadzeniem radia z nim tak, aby pozostawało na biegu jałowym przy 0, a 1 jest początkiem. Następnie odwróć otrzymane dane przed przetwarzaniem ich za pomocą UART.
RBerteig
6

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.

pjc50
źródło
5

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.

wprowadź opis zdjęcia tutaj

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.

Lazar
źródło
4
ascii ma 7 bitów, a nie 8, jednak często stosuje się 8-bitowy zgryz, aby ustawienie trywialne było banalne. Pozwala także na inne zestawy znaków i utf8.
hildred
0

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)/baudratepo 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.

Ronan Paixão
źródło