Apa perbedaan antara Serial.write dan Serial.print? Dan kapan mereka digunakan?

26

Apa perbedaan antara Serial.write dan Serial.print? Dan kapan mereka digunakan?
Keduanya telah digunakan untuk mencetak pada monitor serial, apa perbedaan mereka yang sebenarnya?

shadab
sumber
Penjelasan bagus bpinhosilva! Anda membantu saya memahami sesuatu yang telah saya perjuangkan dengan sangat jelas sekarang.
Rory

Jawaban:

19

Dari situs Arduino untuk Serial.write dan Serial.print :

Serial.write ()

Menulis data biner ke port serial. Data ini dikirim sebagai byte atau serangkaian byte; untuk mengirim karakter yang mewakili digit angka, gunakan fungsi print ().

Serial.print ()

Mencetak data ke port serial sebagai teks ASCII yang dapat dibaca manusia.

LoganBlades
sumber
17

Serial.write lebih membumi, sederhana dan cepat, dibuat untuk berbicara biner, satu byte setiap kali. contoh:

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

Serial.print di sisi lain lebih fleksibel, ia akan melakukan konversi untuk Anda dari ASCII ke biner juga dapat dikonversi ke BIN / HEX / OCT / DEC tetapi Anda perlu menentukan argumen kedua seperti

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" 

lebih banyak contoh dengan output serial visual:

Kode:

  Serial.write(0x48);   // H
  Serial.write(0x45);   // E
  Serial.write(0x4C);   // L
  Serial.write(0x4C);   // L
  Serial.write(0x4F);   // O

OUTPUT SERI: masukkan deskripsi gambar di sini

Kode:

  Serial.print("HELLO");

OUTPUT SERI: masukkan deskripsi gambar di sini

Serial.println () di sisi lain akan menambahkan akhir baris 2 byte 0x0D dan 0x0A seperti yang Anda lihat dalam bingkai

Kode:

  Serial.println("HELLO");

OUTPUT SERI:

masukkan deskripsi gambar di sini

Nassim
sumber
7

Serial.writemengirim byte ke port serial sambil Serial.printmengirim karakter ASCII sehingga orang dapat membaca dengan mudah.

Beberapa perangkat bekerja menggunakan byte untuk mengatur konfigurasi, umumnya menggunakan paket data dan Anda perlu menggunakan fungsi tulis untuk berkomunikasi dengannya. Akhirnya mereka akan mengirim byte melalui antarmuka serial dan kemudian Anda dapat menginterpretasikan dengan pergi setiap byte.

bpinhosilva
sumber
5

Semua contoh di atas benar, tetapi mungkin lebih jelas .... Semua data yang dikirim melalui port serial dikirim sebagai 1 dan 0. (Jelas .... Saya harap) ... Perbedaan dalam dua perintah adalah bagaimana apa pun yang dikirim sebenarnya diterjemahkan / ditafsirkan ke / dari 1 dan 0 ini. Contoh paling jelas melibatkan pengiriman nomor.

Katakanlah Anda perlu mengirim nomor 217. Representasi biner (1 dan 0) dari nomor ini adalah 11011001. Menggunakan perintah Serial.write(217)secara harfiah hanya akan mengirim 11011001 melintasi garis. Representasi Hex dari nomor yang sama adalah 0xD9, dan perintah Serial.write(0xD9)akan mengirim hal yang sama ... 11011001.

Di sinilah mulai menarik ... Jika Anda menggunakan perintah, Serial.write("217")Anda akan mendapatkan ini: 00110010 00110001 00110111 ... APA?!?!?
Ketika sebuah string dilewatkan sebagai argumen, ia dipecah menjadi karakter individu, dikonversi ke ASCII, dan kemudian dikirim sebagai byte untuk setiap karakter. Anda akan mendapatkan hasil yang sama persis jika Anda menggunakan yang berikut:

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

(00110010 00110001 00110111)

Sekarang mari kita lihat Serial.print(). Perintah Serial.print(217)atau Serial.print("217")keduanya akan mencetak hal yang sama: 00110010 00110001 00110111. Ini karena perintah cetak pertama-tama mengubah angka apa pun menjadi representasi string dan kemudian menggunakan perintah Serial.write()untuk mengirim setiap karakter sebagai bit ASCII individual.

Meskipun ini bukan deskripsi LENGKAP, saya harap ini membantu membuat Anda berpikir ke arah yang benar ...

Yeremia
sumber
3

Namun cara lain untuk menjawab ini adalah dengan menyatakan Serial.write menerima karakter tunggal di mana Serial.print menerima string. Mungkin ada beberapa perbedaan tetapi ini yang utama.

linhartr22
sumber