Co je Serial.begin (9600)?

Vím, že to má něco inicializovat:

Serial.begin(9600); 

Chci však víte, co to ve skutečnosti znamená?

Komentáře

Odpověď

Serial.begin(9600) ve skutečnosti nic nevytiskne. K tomu chcete použít Serial.print("Hello world!") k vytištění textu“ Ahoj světe!“ do sériové konzoly. Spíše inicializuje sériové připojení rychlostí 9600 bitů za sekundu.

Obě strany sériového připojení (tj. Arduino a váš počítač) je třeba nastavit tak, aby používaly sériové připojení se stejnou rychlostí, aby bylo možné získat jakýkoli druh srozumitelných údajů. Pokud dojde k nesouladu mezi tím, co si oba systémy myslí, že je rychlost, data budou zkomolená.

9600 bitů za sekundu je výchozí nastavení pro Arduino a je naprosto adekvátní pro většinu uživatelů, ale můžete jej změnit na jiné rychlosti: Serial.begin(57600) nastaví Arduino na přenos rychlostí 57 600 bitů za sekundu. Musíte nastavit jakýkoli software, který ve svém počítači používáte (například Sériový monitor Arduino IDE) na stejnou rychlost, aby bylo možné vidět odesílaná data.

Komentáře

  • Baud a BPS jsou dvě různé věci … nemohu ‚ najít odkaz, který jsem právě hledal.
  • co když vložím “ sériové číslo .begin (0); “ nebo “ Serial.begin (4000); “ . Myslím tím, že chci vědět, jaký je rozdíl mezi čísly?
  • Serial.begin se používá k nastavení rychlosti komunikace v bitech za sekundu. Jeden bajt se rovná 8 bitům, ale sériová připojení odesílají počáteční a koncový bit k identifikaci začátku a konce konkrétního bajtu přijímajícímu systému. K odeslání jednoho znaku je tedy zapotřebí 10 bitů. Použití Serial.begin(0) řekne Arduinu, že by mělo komunikovat sériově rychlostí 0 bitů za sekundu. Jak můžete očekávat, znamená to, že Arduino nikdy neposílá vůbec žádná data. Serial.begin(4000) způsobí, že Arduino bude odesílat data rychlostí 4 000 bitů za sekundu. To je nestandardní, ale jinak v pořádku.
  • Stručně řečeno: změna čísla změní rychlost. Díky menšímu počtu (např. Serial.begin(300)) bude Arduino odesílat data pomaleji. Jeho zvýšení, řekněme na 57600, bude odesílat data rychleji. Odesílající i přijímací systém se musí shodnout na tom, jakou rychlost použít: sériový program vašeho počítače ‚, jako je okno Arduino Serial Monitor, vám umožní nastavit rychlost, jakou váš počítač bude přijímat data, ale můžete si vybrat pouze z běžných rychlostí: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 a 11520 bit / s. ‚ Nelze zadat jiné rychlosti, například 4000. 9600 je obvykle dobré.
  • Baud and BPS are two different things... can't find the link I was looking for now. – zde ‚ s jedním vysvětlením: Dodatek C: “ baud “ vs. “ bps “

Odpověď

Obrázek má hodnotu 1 000 slov, takže se říká, (1024 slov, pokud pracujete s počítači), takže zveřejním několik obrázků …

Nastavil jsem své Uno na odesílání „Fab“ při 9600 baudech a výsledky jsem zachytil na logickém analyzátoru.

Sériové komunikace - 3 písmena

Červeně stínované části představují období„ nečinnosti “mezi bajty.

Z výše uvedené grafické poznámky Datová linka Tx (přenos) je obvykle vysoká (1), dokud neklesne na nízkou hodnotu, aby označila začátek znaku (bajt). Toto je počáteční bit . Potom 8 datových bitů (označených bílými tečkami) ) se zobrazují s přenosovou rychlostí (9600 vzorků za sekundu). Poté se linka opět zvýší. Toto je stop bit (červená část). Pak vidíme počáteční bit pro další postavu atd. Část „stop“ může být neomezeně dlouhá, musí však mít alespoň jednu bitovou délku.


Další podrobnosti pro první znak (písmeno „F“ nebo 0x46 nebo 0b01000110) mohou být vidět zde:

Sériové komunikace - jeden bajt

  • A – žádná data (Tx je vysoká)

  • B – „počáteční bit“. Linka je vybrána, aby informovala přijímač, že znak (bajt) začíná být odesílán. Přijímač čeká jeden a půl hodiny před vzorkováním linky.

  • C – přijde první znak (písmeno „F“ nebo 0x46 nebo 0b01000110). Neexistuje žádný hodinový bit jako takový, příchozí data se jednoduše vzorkují při přenosové rychlosti (baud). Na rozdíl od komunikace SPI přicházejí data nejprve s nejméně významným bitem (v případě, že neposíláte 8 bitů na bajt). Vidíme tedy 01100010 (spíše než 01000110).

  • D – stop bit. To je vždy vysoké, abychom zajistili, že můžeme rozlišovat mezi koncem tohoto bajtu a začátkem dalšího. Vzhledem k tomu, že počáteční bit je nula a stop bit je jeden, vždy existuje jasný přechod z jednoho bajtu na další.

  • E – počáteční bit pro další znak.


Ze záznamu logického analyzátoru můžete vidět, že T1 - T2 je 0,1041667 ms a jak se to stane to je 1/9600:

1 / 9600 = 0.00010416666 seconds 

Rychlost 9600 vám tedy dává počet bitů za sekundu a inverzní je časový interval mezi bity .


Další úvahy

  • Sériové komunikace nejsou samočinné (na rozdíl od SPI nebo I2C a dalších), a proto se odesílatel i příjemce musí shodnout na hodinové frekvenci.

  • Taktovací frekvence není u Arduina přesná, protože hardware musí rozdělit systémové hodiny, aby získal sériové hodiny, a dělení není vždy přesné. Téměř vždy dojde k chybě, částka je uvedena v datovém listu (údaje uvedené pro systémové hodiny 16 MHz, například na Uno):

    Chyba sériové přenosové rychlosti

  • Můžete změnit počet datových bitů, nemusíte je odesílat 8 z nich, ve skutečnosti můžete odeslat 5 až 9 bitů.

  • Po datových bitech může být volitelně odeslán bit parita .

    • Pokud zadáte „lichou“ paritu, paritní bit je nastaven tak, že celkový počet 1 bitů bude lichý.
    • Pokud zadáte „sudou“ paritu , paritní bit je nastaven tak, že celkový počet 1 bitů je sudý.
    • Pokud nezadáte žádnou paritu, paritní bit je vynechán.

    To může pomoci přijímači zjistit, zda data dorazila správně nebo ne.

  • Paritní bit je odeslán před zastavovacím bitem.

  • V případě 9 datových bitů (použitých v protokolu SeaTalk) je paritní bit znovu použit jako 9. datový bit . Proto nemůžete mít 9 datových bitů a paritní bit.

  • Můžete mít také dva stop bity. To v podstatě jen prodlužuje čas mezi bajty. Ve „starém dní „to bylo proto, aby pomalé elektromechanické zařízení mohlo zpracovat předchozí bajt (např. pro jeho tisk).


Možné poškození

Pokud začnete poslouchat sériová data uprostřed streamu, je docela možné, že 0-bit uprostřed streamu bude interpretován jako startovací bit a poté bude přijímač interpretovat vše poté nesprávně.

Jediným skutečným způsobem, jak se z toho zotavit, je mít dostatečně velkou mezeru, čas od času (např. 10 bitů dlouhou), aby se to nestalo.


Invertovaná logika

Zde zobrazené bity (na logické úrovni) nejsou invertovány. To znamená, že 1-bit je VYSOKÝ a 0-bit je NÍZKÝ. Pokud máte zařízení RS232, které pravděpodobně bude posílat něco jako -12 V pro 1-bit a +12 V pro 0-bit. To je invertováno, protože jeden je menší než th nulová, napěťová.

Pokud máte taková zařízení, musíte provést převod napětí a logickou inverzi. Čipy jako MAX232 udělají obojí za vás. Mohou také poskytnout -12 V potřebných k řízení takového zařízení interním generováním pomocí několika kondenzátorů dodaných uživatelem.


Rychlostní pravidlo

Vzhledem k tomu, že s jedním počátečním bitem, 8 datovými bity a jedním stop bitem máme celkem 10 bitů, můžeme rychle vypočítat počet bajtů můžete vysílat za sekundu dělením bitové rychlosti číslem 10.

Např. Při 9600 BPS můžete odeslat 960 bajtů za sekundu.


Kód pro reprodukci:

 void setup() { Serial.begin(9600); Serial.print("Fab"); } void loop () { }  

Odpověď

; TLDR; Inicializuje sériový komunikační port a nastavuje přenosovou rychlost. Zařízení, se kterým komunikujete (nebo sériový monitor Arduino IDE), musí být nastaveno na odpovídající přenosovou rychlost. Jakmile inicializujete port, můžete začít odesílat nebo přijímat znaky. Arduino Serial Reference

Komentáře

  • Nezmenšovat ani nerespektovat @ Nick- Gammon ‚ vynikající pokrytí tohoto tématu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *