Vad är skillnaden mellan Serial.write och Serial.print? Och när används de?
Båda har använts för att skriva ut på seriell bildskärm, vilka är deras faktiska skillnader?
Svar
Serial.write är mer jordnära, det är enkelt och snabbt, det är gjort för att prata binärt, en byte i taget. exempel:
Serial.write(0x45); // will write 0100 0101 to the cable
Serial.print å andra sidan är mer mångsidig, det kommer att göra omvandlingen för dig från ASCII till binär, det kan också konvertera till BIN / HEX / OCT / DEC men du måste ange ett andra argument så
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"
fler exempel med visuell seriell utgång:
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 () å andra sidan lägger till slutet av rad 2 byte 0x0D och 0x0A som du kan se i ramen
Kod:
Serial.println("HELLO");
SERIALUTGÅNG:
Svar
Från Arduino-webbplatsen för Serial.write och Serial.print :
Serial.write ()
Skriver binär data till den seriella porten. Dessa data skickas som en byte eller en serie byte; för att skicka tecknen som representerar siffrorna i ett nummer använder du funktionen print () istället.
Seriell .print ()
Skriver ut data till serieporten som läsbar ASCII-text.
Svar
Serial.write
skickar byte till den seriella porten medan Serial.print
skickar ASCII-tecken så att människor lätt kan läsa.
Vissa enheter arbetar med byte för att ställa in konfigurationer, använder ofta datapaket och du måste använda skrivfunktionen för att kommunicera med dem. Så småningom kommer de att skicka byte via det seriella gränssnittet och sedan kan du tolka genom att gå varje byte.
Svar
Alla exemplen ovan är korrekta, men kanske tydligare …. All data som skickas via den seriella porten skickas som 1 ”s och 0” s. (uppenbart …. jag hoppas) … Skillnaden i de två kommandona är hur allt som skickas faktiskt översätts / tolkas till / från dessa 1 ”och 0”. Det tydligaste exemplet handlar om att sända nummer.
Låt oss säga att du måste skicka siffran 217. Den binära (1 ”s och 0”) representationen för detta nummer är 11011001. Använd kommandot Serial.write(217)
skickar bokstavligen bara 11011001 över linjen. Hexrepresentationen för samma nummer är 0xD9 och kommandot Serial.write(0xD9)
skickar samma sak … 11011001.
Här blir det intressant … Om du skulle använda kommandot Serial.write("217")
skulle du istället få det här: 00110010 00110001 00110111 … VAD?!?!?
När en sträng skickas som argument delas den upp i enskilda tecken, konverteras till ASCII och skickas sedan som en byte för varje tecken. Du skulle få exakt samma utdata om du skulle använda följande:
Serial.write(50); Serial.write(51); Serial.write(55);
(00110010 00110001 00110111)
Låt oss nu titta på Serial.print()
. Kommandona Serial.print(217)
eller Serial.print("217")
kommer båda att skriva ut samma sak: 00110010 00110001 00110111. Detta beror på att utskriftskommandot först konverterar valfritt tal till ett strängrepresentation och använder sedan kommandot Serial.write()
för att skicka varje tecken som enskilda ASCII-bitar.
Även om detta inte är en KOMPLET beskrivning hoppas jag att det hjälper dig tänker i rätt riktning …
Svar
Ännu ett sätt att svara på detta är att säga att Serial.write accepterar enstaka tecken där Serial.print accepterar strängar. Det kan finnas vissa skillnader men det här är den viktigaste.
Serial.write(stringData.c_str());
? om stringData definieras som String.