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?
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.
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.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.
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ł:
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 ...
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.
Odpowiedzi:
Ze strony Arduino dla Serial.write i Serial.print :
Serial.write ()
Serial.print ()
źródło
Serial.write jest bardziej przyziemny, jest prosty i szybki, jest przeznaczony do mówienia binarnie, jeden bajt na raz. przykład:
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
więcej przykładów z wizualnym wyjściem szeregowym:
Kod:
WYJŚCIE SZEREGOWE:
Kod:
WYJŚCIE SZEREGOWE:
Z drugiej strony Serial.println () doda koniec bajtów 0x0D i 0x0A, jak widać w ramce
Kod:
WYJŚCIE SZEREGOWE:
źródło
Serial.write
wysyła bajty do portu szeregowego, aSerial.print
wysył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.
źródło
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 polecenieSerial.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ł:
(00110010 00110001 00110111)
Teraz spójrzmy na
Serial.print()
. PoleceniaSerial.print(217)
lubSerial.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 ...
źródło
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.
źródło