Saya mengirim daftar posisi servo melalui koneksi serial ke Arduino dalam format berikut
1:90&2:80&3:180
Yang akan diuraikan sebagai:
servoId : Position & servoId : Position & servoId : Position
Bagaimana saya membagi nilai-nilai ini, dan mengubahnya menjadi integer?
serial
arduino-mega
string
ValrikRobot
sumber
sumber
Jawaban:
Berlawanan dengan jawaban lain, saya lebih suka menjauh
String
karena alasan berikut:Dalam lingkungan tertanam seperti Arduino (bahkan untuk Mega yang memiliki lebih banyak SRAM), saya lebih suka menggunakan fungsi C standar :
strchr()
: mencari karakter dalam string C (yaituchar *
)strtok()
: membagi string C menjadi substring, berdasarkan karakter pemisahatoi()
: mengonversi string C menjadiint
Itu akan mengarah pada contoh kode berikut:
Keuntungannya di sini adalah tidak ada alokasi memori dinamis yang terjadi; Anda bahkan dapat mendeklarasikan
input
sebagai variabel lokal di dalam fungsi yang akan membaca perintah dan menjalankannya; setelah fungsi dikembalikan ukuran yang ditempati olehinput
(dalam tumpukan) dipulihkan.sumber
Fungsi ini dapat digunakan untuk memisahkan string menjadi potongan-potongan berdasarkan apa karakter pemisahnya.
Konversi String ke int
Potongan kode ini mengambil string dan memisahkannya berdasarkan karakter yang diberikan dan mengembalikan item di antara karakter yang memisahkan
sumber
Anda dapat melakukan sesuatu seperti yang berikut ini, tetapi harap pertimbangkan beberapa hal:
Jika Anda menggunakan
readStringUntil()
, itu akan menunggu sampai menerima karakter atau batas waktu. Jadi, dengan string Anda saat ini, posisi terakhir akan bertahan sedikit lebih lama, karena harus menunggu. Anda dapat menambahkan trailing&
untuk menghindari batas waktu ini. Anda dapat dengan mudah memeriksa perilaku ini di monitor Anda, cobalah untuk mengirim string dengan dan tanpa ekstra&
dan Anda akan melihat penundaan batas waktu tersebut.Anda benar-benar tidak perlu indeks servo, Anda hanya dapat mengirim string Anda dari posisi, dan indeks servo dengan posisi nilai dalam string, seperti:
90&80&180&
. Jika Anda menggunakan indeks servo, mungkin Anda ingin memeriksanya (konversikan keint
, dan kemudian cocok dengan indeks loop i) untuk memastikan bahwa tidak ada yang salah dengan pesan Anda.Anda harus memeriksa bahwa string yang kembali dari
readStringUntil
tidak kosong. Jika fungsi timeout, Anda tidak menerima data yang cukup, dan dengan demikian setiap upaya untuk mengekstraksiint
nilai Anda akan menghasilkan hasil yang aneh.sumber
Anda dapat menggunakan
Stream.readStringUntil(terminator)
melewati terminator yang berbeda untuk setiap bagian.Pada setiap bagian Anda kemudian memanggil
String.toInt
sumber
Solusi paling sederhana adalah dengan menggunakan sscanf () .
Ini menghasilkan output sebagai berikut:
Tepuk tangan!
sumber
invalid conversion from 'int' to 'char*' [-fpermissive]
Lihat contoh di: https://github.com/BenTommyE/Arduino_getStringPartByNr
sumber
sumber
jfpoilpret memberikan jawaban yang bagus untuk parsing perintah serial di Arduino. Namun Attiny85 tidak memiliki serial dua arah - SoftwareSerial harus digunakan. Ini adalah bagaimana Anda memasukkan kode yang sama untuk Attiny85
Skema Attiny85 untuk nomor pin
Kompilasi sketsa menjadi:
Jadi ada banyak ruang dan memori untuk sisa kode
sumber
Arduino
kata kunci dan kadang-kadang masuk ke situasi yang sangat sulit karena menerapkan kode Arduino ke Attiny tidak selalu sepele. Harus mengkonversi kode asli untuk bekerja di Attiny, mengujinya bekerja dan memutuskan untuk membaginyasumber
sumber
Berikut adalah metode Arduino untuk memecah sebuah String sebagai jawaban untuk pertanyaan "Bagaimana cara memecah string dalam substring?" dinyatakan sebagai duplikat dari pertanyaan ini.
Tujuan dari solusi ini adalah mengurai serangkaian posisi GPS yang dicatat dalam file kartu SD . Alih-alih memiliki String yang diterima dari
Serial
, String dibaca dari file.Fungsi ini
StringSplit()
mem-parsing sebuah StringsLine = "1.12345,4.56789,hello"
ke 3 StringssParams[0]="1.12345"
,sParams[1]="4.56789"
&sParams[2]="hello"
.String sInput
: jalur input yang akan diuraikan,char cDelim
: karakter pembatas antara parameter,String sParams[]
: array output dari parameter,int iMaxParams
: jumlah maksimum parameter,int
: jumlah parameter yang diuraikan,Fungsi ini didasarkan pada
String::indexOf()
danString::substring()
:Dan penggunaannya sangat sederhana:
sumber