Jaka jest różnica między Serial.write i Serial.print? A kiedy są używane?
Oba zostały użyte do drukowania na monitorze szeregowym, jakie są ich rzeczywiste różnice?
Odpowiedź
Serial.write jest bardziej przyziemny, jest prosty i szybki, jest stworzony do mówienia binarnie, po jednym bajcie na raz. przykład:
Serial.write(0x45); // will write 0100 0101 to the cable
Serial.print z drugiej strony jest bardziej wszechstronny, dokona konwersji z ASCII na binarny, a także może przekonwertować na BIN / HEX / OCT / DEC, ale musisz określić drugi argument w ten sposób
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"
więcej przykładów z wizualnym wyjściem szeregowym:
Kod:
Serial.write(0x48); // H Serial.write(0x45); // E Serial.write(0x4C); // L Serial.write(0x4C); // L Serial.write(0x4F); // O
Kod:
Serial.print("HELLO");
Serial.println () z drugiej strony doda koniec linii 2 bajty 0x0D i 0x0A, jak widać w ramce
Kod:
Serial.println("HELLO");
WYJŚCIE SZEREGOWE:
Odpowiedź
Z witryny Arduino dla Serial.write i Serial.print :
Serial.write ()
Zapisuje dane binarne do portu szeregowego. Te dane są wysyłane jako bajt lub seria bajtów; aby wysłać znaki reprezentujące cyfry liczby, użyj zamiast tego funkcji print ().
Serial .print ()
Drukuje dane na porcie szeregowym jako czytelny dla człowieka tekst ASCII.
Odpowiedź
Serial.write
wysyła bajtów do portu szeregowego, podczas gdy Serial.print
wysyła znaki ASCII, dzięki czemu ludzie mogą łatwo czytać.
Niektóre urządzenia używają bajtów do ustawiania konfiguracji, zwykle używają pakietów danych, a ty trzeba używać funkcji zapisu, aby się z nimi komunikować. Ostatecznie wyślą bajty przez interfejs szeregowy, a następnie możesz zinterpretować każdy bajt.
Odpowiedź
Wszystkie powyższe przykłady są poprawne, ale może wyraźniej… Wszystkie dane przesyłane przez port szeregowy są wysyłane jako 1 „si 0”. (oczywiste … mam nadzieję) … Różnica w tych dwóch poleceniach polega na tym, w jaki sposób to, co jest wysyłane, jest faktycznie tłumaczone / interpretowane do / z tych 1 „i 0”. Najlepszym przykładem jest przekazywanie liczb.
Powiedzmy, że musisz wysłać liczbę 217. Binarna (1 „si 0” s) reprezentacja tej liczby to 11011001. Używając polecenia Serial.write(217)
dosłownie wyśle po prostu 11011001 przez wiersz. Szesnastkowa reprezentacja tej samej liczby to 0xD9, a polecenie Serial.write(0xD9)
wyśle to samo … 11011001.
Tutaj robi się interesująco … Gdybyś użył polecenia Serial.write("217")
, zamiast tego otrzymałeś: 00110010 00110001 00110111 … CO?!?!?
Kiedy łańcuch jest przekazywany jako argument, jest on dzielony na pojedyncze znaki, konwertowany na ASCII, a następnie wysyłany jako bajt dla każdego znaku. Otrzymałbyś dokładnie to samo wyjście, gdybyś użył następującego:
Serial.write(50); Serial.write(51); Serial.write(55);
(00110010 00110001 00110111)
Spójrzmy teraz na Serial.print()
. Polecenia Serial.print(217)
lub Serial.print("217")
wypisują to samo: 00110010 00110001 00110111. Dzieje się tak, ponieważ polecenie print najpierw konwertuje dowolną liczbę na reprezentacja ciągu, a następnie używa polecenia Serial.write()
, aby wysłać każdy znak jako oddzielne bity ASCII.
Chociaż nie jest to KOMPLETNY opis, mam nadzieję, że pomoże ci to myślenie we właściwym kierunku …
Odpowiedź
Jeszcze innym sposobem odpowiedzi jest stwierdzenie, że Serial.write akceptuje pojedyncze znaki, w których Serial.print akceptuje ciągi. Mogą występować pewne różnice, ale to jest główna.
Serial.write(stringData.c_str());
? jeśli stringData jest zdefiniowane jako String.