Katakanlah saya memiliki beberapa variabel yang ingin saya cetak ke terminal, apa cara termudah untuk mencetaknya dalam sebuah string?
Saat ini saya melakukan sesuatu seperti ini:
Serial.print("Var 1:");Serial.println(var1);
Serial.print(" Var 2:");Serial.println(var2);
Serial.print(" Var 3:");Serial.println(var3);
Apakah ada cara yang lebih baik untuk melakukan ini?
Jawaban:
ardprintf
adalah fungsi yang saya retas bersama yang disimulasikanprintf
melalui koneksi serial. Fungsi ini (diberikan di bagian bawah) dapat disisipkan di awal file di mana fungsi tersebut diperlukan. Seharusnya tidak membuat konflik.Ini bisa disebut mirip dengan
printf
. Lihat dalam aksi dalam contoh ini:Output seperti yang diharapkan adalah:
Prototipe fungsi adalah:
Ini mengembalikan jumlah argumen yang terdeteksi dalam panggilan fungsi.
Ini adalah definisi fungsi:
** Untuk mencetak
%
karakter, gunakan%%
. *Sekarang, tersedia di inti Github .
sumber
Saya biasanya tidak akan memberikan dua jawaban untuk sebuah pertanyaan, tetapi saya baru saja menemukan ini hari ini , di mana Anda dapat menggunakan printf tanpa buffer.
Ini masih memiliki batasan floating point.
sunting: Saya pikir saya akan melakukan sedikit pengujian pada ini, dan itu berfungsi dengan baik. Saya menambahkan tes yang lebih baik ke loop dengan output yang diformat.
sumber
serial_putchar
fungsi Anda , mengapa tidak membuat pernyataan pengembalianreturn !Serial.write(c);
? Bukankah itu lebih bersih daripada operator trinary karena membalikkan rasa nilai pengembalian boolean?serial_putchar
fungsinya. Ini bekerja menyenangkan. :-) Bisakah Anda memperbaiki batasan floating point ?Ini mungkin tidak lebih baik, hanya berbeda. Anda dapat menggunakan objek String untuk output. Objek-objek ini memungkinkan penyatuan dan mendukung typecasting otomatis.
sumber
Saya biasanya menggunakan Tab untuk membuat hal-hal yang lebih baik dalam Serial. Memiliki hal-hal yang sejajar seperti yang saya lakukan memungkinkan Arduino menyala secepat mungkin sambil dapat melihat perubahan tertentu dalam variabel.
Coba sesuatu seperti ini:
Atau sesuatu seperti ini:
sumber
Saya hanya menggunakan ini untuk debugging tetapi:
sumber
Saya pemula di dunia Arduino, tetapi saya baru-baru ini menemukan bahwa ini hanyalah C ++ biasa (tanpa pengecualian dan mungkin polimorfisme). Tapi Anda masih bisa menikmati templat. Jadi solusi saya adalah menggunakan templat berikut:
Yang menyenangkan di sini adalah tidak menggunakan memori ekstra dan pemrosesan ekstra di sini.
sumber
Saya biasanya (dengan menyakitkan) tetap dengan beberapa baris
Serial.print
tetapi ketika menjadi berbelit-belit saya kembali kesprintf
. Ini menjengkelkan karena Anda harus memiliki buffer yang tersedia untuk itu.Penggunaannya sesederhana (??) seperti:
Namun, kata peringatan, itu tidak (secara default) mendukung tipe mengambang.
sumber
Menggunakan
Streaming.h
, di tempatorang bisa menulis
Definisi
<<
inStreaming.h
in effect menerjemahkannya menjadi serangkaianSerial.print()
panggilan biasa . Artinya,<<
adalah gula sintaksis, diterapkan tanpa meningkatkan ukuran kode.Jika Anda belum
Streaming.h
menginstal, dapatkanStreaming5.zip
dari arduiniana.org . Buka zip di direktori perpustakaan Anda, misalnya di~/sketchbook/libraries
. Tambahkan baris#include <Streaming.h>
dalam sketsa tempat Anda menggunakan<<
sebagai operator streaming.Penentu konversi basis _HEX, _DEC, _OCT, dan _BIN disediakan, serta fungsi _FLOAT (dengan jumlah tempat desimal) dan
endl
. Misalnya, untuk mencetak nilai garis lintang dan bujur dalam bentuk seperti "Koordinat Anda -23.123, 135.4567" orang dapat menulis:Ini juga dapat ditulis sebagai
yang akan menyimpan string yang lebih panjang di PROGMEM alih-alih membawanya ke RAM.
Catatan,
Streaming.h
tidak membangun string apa pun seperti itu; itu hanya mengirimkan teks-nya<<
ke sebuah stream. Kelas PString di arduiniana dapat membangun string dari input stream, jika string bukan output stream yang diinginkan atau dibutuhkan.sumber
Penggunaan akan tergantung dari tipe data variabel Anda.
Jika
int
ya, itu akan menjadi%d
atau%i
Jikastring
ya, itu akan menjadi%s
Wrapper untuk printf
Anda dapat mengubah batas berdasarkan kebutuhan Anda
Sumber: https://playground.arduino.cc/Main/Printf
Contoh penggunaan:
ESP8266
Built-in di
Serial
kelas kerangka kerja. Tidak perlu perpustakaan atau fungsi tambahan.Rincian lebih lanjut tentang memformat tips pada halaman referensi format printf: http://www.cplusplus.com/reference/cstdio/printf/
\n
adalah urutan pelarian untuk umpan baris.Sumber: http://en.cppreference.com/w/cpp/language/escape
[EDIT] - Seperti yang disebutkan @Juraj, itu tidak tersedia di sebagian besar modul AVR. Jadi saya menambahkan ESP8266 disebutkan dan pembungkus printf untuk modul AVR umum
sumber
Salah satu solusi yang mungkin adalah:
Serial.println((String)"Var 1:" + var1 + " Var 2:" + var2 + " Var 3:" + var3);
sumber
Dari http://playground.arduino.cc/Main/Printf Saya mengamati ini berfungsi dengan baik pada mega2560 saya
Hanya itu yang berhasil, tidak perlu untuk vsnprintf_P atau PROGMEM ...
sumber
printf()
itu sendiri ?Anda akan melihat di terminal:
sumber
+
operator.