Jaka jest różnica między Serial.write a Serial.print? A kiedy są używane?

26

Jaka jest różnica między Serial.write a Serial.print? A kiedy są używane?
Oba zostały użyte do drukowania na monitorze szeregowym, jakie są ich rzeczywiste różnice?

shadab
źródło
Doskonałe wyjaśnienie bpinhosilva! Pomogłeś mi zrozumieć coś, z czym teraz bardzo się zmagałem.
Rory

Odpowiedzi:

19

Ze strony Arduino dla Serial.write i Serial.print :

Serial.write ()

Zapisuje dane binarne na porcie szeregowym. Te dane są wysyłane jako bajt lub seria bajtów; aby wysłać znaki reprezentujące cyfry liczby, użyj funkcji print ().

Serial.print ()

Drukuje dane na porcie szeregowym jako tekst ASCII czytelny dla człowieka.

LoganBlades
źródło
17

Serial.write jest bardziej przyziemny, jest prosty i szybki, jest przeznaczony do mówienia binarnie, jeden bajt na raz. przykład:

Serial.write(0x45);   // will write 0100 0101 to the cable

Z drugiej strony serial.print jest bardziej wszechstronny, zrobi dla ciebie konwersję z ASCII na binarny, może również konwertować na BIN / HEX / OCT / DEC, ale musisz podać drugi argument taki

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

WYJŚCIE SZEREGOWE: wprowadź opis zdjęcia tutaj

Kod:

  Serial.print("HELLO");

WYJŚCIE SZEREGOWE: wprowadź opis zdjęcia tutaj

Z drugiej strony Serial.println () doda koniec bajtów 0x0D i 0x0A, jak widać w ramce

Kod:

  Serial.println("HELLO");

WYJŚCIE SZEREGOWE:

wprowadź opis zdjęcia tutaj

Nassim
źródło
7

Serial.writewysyła bajty do portu szeregowego, a Serial.printwysyła znaki ASCII, aby ludzie mogli łatwo czytać.

Niektóre urządzenia używają bajtów do ustawiania konfiguracji, zwykle używają pakietów danych i do komunikacji z nimi należy użyć funkcji zapisu. W końcu wyślą bajty przez interfejs szeregowy, a następnie można interpretować, przechodząc każdy bajt.

bpinhosilva
źródło
5

Wszystkie powyższe przykłady są poprawne, ale może bardziej wyraźne ... Wszystkie dane przesyłane przez port szeregowy są wysyłane jako 1 i 0. (oczywiste .... mam nadzieję) ... Różnica między tymi dwoma poleceniami polega na tym, jak to, co jest wysyłane, jest faktycznie tłumaczone / interpretowane na / z tych 1 i 0. Najwyraźniejszym przykładem jest przesyłanie liczb.

Powiedzmy, że musisz wysłać liczbę 217. Binarna reprezentacja tego numeru to 11011001. Użycie polecenia Serial.write(217)spowoduje dosłownie wysłanie 11011001 przez linię. Szesnastkowa reprezentacja tego samego numeru to 0xD9, a polecenie Serial.write(0xD9)wyśle ​​to samo ... 11011001.

Tutaj jest ciekawie ... Gdybyś użył polecenia Serial.write("217"), zamiast tego dostałbyś to: 00110010 00110001 00110111 ... CO ?!?!?
Gdy ciąg 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 takie same dane wyjściowe, gdybyś używał:

Serial.write(50);
Serial.write(51);
Serial.write(55);

(00110010 00110001 00110111)

Teraz spójrzmy na Serial.print(). Polecenia Serial.print(217)lub Serial.print("217")oba wydrukują to samo: 00110010 00110001 00110111. Jest tak, ponieważ polecenie drukowania najpierw konwertuje dowolną liczbę na ciąg znaków, a następnie używa polecenia, Serial.write()aby wysłać każdy znak jako pojedyncze bity ASCII.

Chociaż nie jest to KOMPLETNY opis, mam nadzieję, że pomoże ci to myśleć we właściwym kierunku ...

Jerimiah
źródło
3

Jeszcze innym sposobem odpowiedzi jest stwierdzenie, że Serial.write akceptuje pojedyncze znaki, a Serial.print akceptuje ciągi znaków. Mogą występować pewne różnice, ale ta jest główna.

linhartr22
źródło