Bagaimana cara membagi masuk string?
Saya mengirimkan daftar servo posisi melalui koneksi serial ke arduino dalam format berikut
1:90&2:80&3:180
Yang akan diuraikan sebagai:
servoId : Posisi & servoId : Posisi & servoId : Posisi
Bagaimana saya akan membagi nilai-nilai ini, dan mengkonversi mereka ke integer?
52
12
Sebaliknya untuk jawaban yang lain, saya'd agak menjauh dari
String
untuk alasan berikut:Dalam tertanam lingkungan seperti Arduino (bahkan untuk Mega yang memiliki lebih SRAM), I'd suka menggunakan fungsi-fungsi standar C:
strchr()
: mencari karakter dalam string C (yaituchar *
)strtok()
: membagi C string menjadi substring, berdasarkan karakter pemisahatoi()
: mengkonversi string C untuk sebuahint
Itu akan mengarah pada contoh kode berikut:
Keuntungan di sini adalah bahwa tidak ada alokasi memori dinamis berlangsung; anda bahkan dapat menyatakan
input
sebagai variabel lokal dalam fungsi yang akan membaca perintah dan mengeksekusi mereka; setelah fungsi ini mengembalikan ukuran ditempati olehinput
(dalam stack) pulih.Fungsi ini dapat digunakan untuk memisahkan string menjadi potongan-potongan yang didasarkan pada apa yang memisahkan karakter.
Mengkonversi String ke int
Ini Potongan code yang mengambil string dan memisahkannya berdasarkan karakter tertentu dan kembali Item antara memisahkan karakter
Anda bisa melakukan sesuatu seperti berikut, tetapi perlu mempertimbangkan beberapa hal:
Jika anda menggunakan
readStringUntil()
, itu akan menunggu sampai menerima karakter atau timeout. Dengan demikian, dengan anda saat ini string, posisi terakhir akan berlangsung sedikit lebih lama, karena harus menunggu. Anda dapat menambahkan akhiran&
untuk menghindari hal ini timout. Anda dapat dengan mudah memeriksa perilaku ini di monitor anda, cobalah untuk mengirim string dengan dan tanpa tambahan&
dan anda akan melihat seperti penundaan waktu habis.Anda sebenarnya tidak perlu servo indeks, anda hanya dapat mengirim string dari posisi, dan mendapatkan servo indeks dengan nilai posisi pada string, seperti:
90&80&180&
. Jika anda menggunakan servo indeks, mungkin anda ingin check it (mengkonversi keint
, dan kemudian mencocokkan lingkaran indeks i) untuk memastikan bahwa tidak ada yang salah dengan pesan anda.Anda harus memeriksa bahwa mengembalikan string
readStringUntil
tidak kosong. Jika fungsi timeout, anda didn't menerima data yang cukup, dan dengan demikian setiap upaya untuk mengekstrakint
nilai-nilai akan menghasilkan hasil yang aneh.Anda dapat menggunakan
Streaming.readStringUntil(terminator)
melewati berbagai terminator untuk masing-masing bagian.Pada setiap bagian anda kemudian memanggil
String.toInt
Solusi yang paling sederhana adalah dengan menggunakan sscanf().
Ini memberikan output sebagai berikut:
Cheers!
Lihat contoh di: https://github.com/BenTommyE/Arduino_getStringPartByNr
jfpoilpret disediakan besar jawaban untuk parsing perintah serial pada Arduino. Namun Attiny85 doesn't memiliki dua arah serial - SoftwareSerial untuk digunakan. Ini adalah bagaimana anda port kode yang sama untuk Attiny85
Attiny85 skema nomor pin
Sketsa mengkompilasi menjadi:
Jadi ada banyak ruang dan memori untuk sisa dari kode
It's tidak menjawab pertanyaan anda, tapi mungkin bisa berguna bagi seseorang. Jika anda string memiliki awalan tertentu, maka anda dapat menggunakan hanya
startsWith
dansubstring
. E. g.Dan kemudian mengirim
ketinggian 10
apa yang akan mengekstrak10
.Berikut ini adalah Arduino metode untuk membagi String sebagai jawaban untuk pertanyaan "Bagaimana untuk membagi string di substring?" dinyatakan sebagai duplikat dari pertanyaan ini.
Tujuan dari solusi untuk mengurai serangkaian GPS posisi login ke SD file. Alih-alih memiliki String yang diterima dari
Berantai
, String yang dibaca dari file.Fungsi adalah
StringSplit()
mengurai StringsLine = "1.12345,4.56789,hello"
3 StringsParams[0]="1.12345"
,sParams[1]="4.56789"
&sParams[2]="hello"
.String sInput
: jalur input untuk diurai,char cDelim
: karakter delimiter antara parameter,String sParams[]
: array output parameter,int iMaxParams
: jumlah maksimum dari parameter,int
: jumlah parsing parameter,Fungsi ini didasarkan pada
String::indexOf()
danString::substring()
:Dan penggunaan sangat sederhana: