Jaký je rozdíl mezi Serial.write a Serial.print? A kdy jsou použity?
Oba byly použity k tisku na sériovém monitoru, jaké jsou jejich skutečné rozdíly?
Odpověď
Serial.write je více na zemi, je to jednoduché a rychlé, je vyrobeno mluvit binárně, jeden bajt po druhém. příklad:
Serial.write(0x45); // will write 0100 0101 to the cable
Serial.print je na druhou stranu všestrannější, provede za vás převod z ASCII na binární, může také převést na BIN / HEX / OCT / DEC, ale je třeba zadat druhý argument podobný
Serial.print(76, BIN) gives "0100 1100" Serial.print(76, OCT) gives "114" Serial.print("L", DEC) gives "76" Serial.print(76, HEX) gives "4C"
další příklady s vizuálním sériovým výstupem:
Kód:
Serial.write(0x48); // H Serial.write(0x45); // E Serial.write(0x4C); // L Serial.write(0x4C); // L Serial.write(0x4F); // O
Kód:
Serial.print("HELLO");
Serial.println () na druhé straně přidá konec řádku 2 bajty 0x0D a 0x0A, jak vidíte v rámečku
Kód:
Serial.println("HELLO");
SÉRIOVÝ VÝSTUP:
Odpověď
Z webu Arduino pro Serial.write a Serial.print :
Serial.write ()
Zapíše binární data na sériový port. Tato data se odesílají jako bajt nebo řada bajtů; k odeslání znaků představujících číslice čísla použijte místo toho funkci print ().
Sériové číslo .print ()
Vytiskne data na sériový port jako text ASCII čitelný člověkem.
odpověď
Serial.write
odešle bajtů na sériový port, zatímco Serial.print
odesílá znaky ASCII, aby lidé mohli snadno číst.
Některá zařízení pracují s bajty k nastavení, běžně používají datové pakety a vy pro komunikaci s nimi je třeba použít funkci zápisu. Nakonec budou posílat bajty přes sériové rozhraní a pak můžete interpretovat procházením každého bajtu.
Odpovědět
Všechny výše uvedené příklady jsou správné, ale možná jasněji …. Všechna data odeslaná přes sériový port jsou odesílána jako 1 „s a 0“ s. (zřejmé …. doufám) … Rozdíl mezi těmito dvěma příkazy spočívá v tom, že vše, co je odesíláno, je ve skutečnosti přeloženo / interpretováno do / z těchto hodnot 1 a 0. Nejjasnější příklad zahrnuje přenos čísel.
Řekněme, že potřebujete odeslat číslo 217. Binární (1 „a 0“) reprezentace tohoto čísla je 11011001. Pomocí příkazu Serial.write(217)
doslova pošle přes linku 11011001. Hexová reprezentace stejného čísla je 0xD9 a příkaz Serial.write(0xD9)
pošle totéž … 11011001.
Tady to začíná být zajímavé … Pokud byste použili příkaz Serial.write("217")
, místo toho byste dostali toto: 00110010 00110001 00110111 … CO?!?!?
Když je řetězec předán jako argument, je rozdělen na jednotlivé znaky, převeden na ASCII a poté odeslán jako bajt pro každý znak. Přesný stejný výstup byste dostali, pokud byste použili následující:
Serial.write(50); Serial.write(51); Serial.write(55);
(00110010 00110001 00110111)
Nyní se podívejme na Serial.print()
. Příkazy Serial.print(217)
nebo Serial.print("217")
vytisknou totéž: 00110010 00110001 00110111. Důvodem je, že příkaz print nejprve převede libovolné číslo na řetězcová reprezentace a poté pomocí příkazu Serial.write()
odeslat každý znak jako jednotlivé bity ASCII.
Ačkoli se nejedná o KOMPLETNÍ popis, doufám, že vám pomůže myslet správným směrem …
Odpovědět
Dalším způsobem, jak na to odpovědět, je uvést, že Serial.write přijímá jednotlivé znaky, kde Serial.print přijímá řetězce. Mohou existovat určité rozdíly, ale toto je hlavní.
Serial.write(stringData.c_str());
? pokud je řetězecData definována jako řetězec.