Przesyłam listę pozycji serwomechanizmu poprzez połączenie szeregowe z arduino w następującym formacie
1:90&2:80&3:180
Który byłby analizowany jako:
servoId : Position & servoId : Position & servoId : Position
Jak podzielić te wartości i przekonwertować je na liczby całkowite?
serial
arduino-mega
string
ValrikRobot
źródło
źródło
Odpowiedzi:
W przeciwieństwie do innych odpowiedzi wolałbym trzymać się z daleka z
String
następujących powodów:W środowisku osadzonym, takim jak Arduino (nawet dla Mega, który ma więcej SRAM), wolałbym używać standardowych funkcji C :
strchr()
: wyszukaj znak w ciągu C (tj.char *
)strtok()
: dzieli łańcuch C na podciągi na podstawie znaku separatoraatoi()
: konwertuje ciąg C naint
Doprowadziłoby to do następującego przykładu kodu:
Zaletą jest to, że nie następuje dynamiczny przydział pamięci; możesz nawet zadeklarować
input
jako zmienną lokalną wewnątrz funkcji, która odczytuje polecenia i wykonuje je; po zwróceniu funkcjiinput
odzyskiwany jest rozmiar zajmowany przez (w stosie).źródło
Tej funkcji można użyć do rozdzielenia łańcucha na części w zależności od tego, jaki jest znak oddzielający.
Konwertuj ciąg na int
Ta część kodu pobiera ciąg i oddziela go na podstawie danego znaku i zwraca element między znakiem oddzielającym
źródło
Możesz zrobić coś takiego, ale weź pod uwagę kilka rzeczy:
Jeśli użyjesz
readStringUntil()
, poczeka, aż otrzyma postać lub limity czasu. Tak więc, z twoim bieżącym łańcuchem, ostatnia pozycja będzie trwać trochę dłużej, ponieważ musi czekać. Możesz dodać znak&
końca, aby uniknąć tego limitu czasu. Możesz łatwo sprawdzić to zachowanie na monitorze, spróbować wysłać ciąg z dodatkowym&
i bez dodatkowego, a zobaczysz takie opóźnienie.Faktycznie nie trzeba indeks serwo, można po prostu wysłać swój ciąg stanowisk i uzyskać indeks serwo przez pozycję w łańcuchu wartości, coś takiego:
90&80&180&
. Jeśli korzystasz z indeksu serwomechanizmu, być może chcesz go sprawdzić (przekonwertuj naint
, a następnie dopasuj indeks pętli i), aby upewnić się, że nic nie poszło nie tak z twoją wiadomością.Musisz sprawdzić, czy zwracany ciąg
readStringUntil
nie jest pusty. Jeśli funkcja przekroczy limit czasu, nie otrzymałeś wystarczającej ilości danych, a zatem każda próba wyodrębnieniaint
wartości przyniesie dziwne wyniki.źródło
Możesz użyć
Stream.readStringUntil(terminator)
podania innego terminatora dla każdej części.Następnie do każdej części dzwonisz
String.toInt
źródło
Najprostszym rozwiązaniem jest użycie sscanf () .
Daje to następujące dane wyjściowe:
Twoje zdrowie!
źródło
invalid conversion from 'int' to 'char*' [-fpermissive]
Zobacz przykład na: https://github.com/BenTommyE/Arduino_getStringPartByNr
źródło
źródło
jfpoilpret dostarczył świetną odpowiedź na analizę komend szeregowych na Arduino. Jednak Attiny85 nie ma dwukierunkowego numeru seryjnego - należy użyć SoftwareSerial. W ten sposób portujesz ten sam kod dla Attiny85
Schematy Attiny85 dla numerów pinów
Szkic kompiluje się w:
Jest więc dużo miejsca i pamięci na resztę kodu
źródło
Arduino
słowa kluczowego i czasami wpadają w bardzo trudne sytuacje, ponieważ implementacja kodu Arduino na Attiny nie zawsze jest banalna. Musiałem przekonwertować oryginalny kod do pracy na Attiny, przetestowałem go i postanowiłem go udostępnićźródło
źródło
Oto metoda Arduino na dzielenie łańcucha jako odpowiedź na pytanie „Jak podzielić łańcuch na podciąg?” zadeklarowane jako duplikat niniejszego pytania.
Celem tego rozwiązania jest analiza szeregu pozycji GPS zapisanych w pliku karty SD . Zamiast otrzymania ciągu od
Serial
, ciąg jest odczytywany z pliku.Funkcja
StringSplit()
parsuje ciąg znakówsLine = "1.12345,4.56789,hello"
na 3 ciągisParams[0]="1.12345"
,sParams[1]="4.56789"
isParams[2]="hello"
.String sInput
: wiersze wejściowe do przeanalizowania,char cDelim
: znak ogranicznika między parametrami,String sParams[]
: tablica wyjściowa parametrów,int iMaxParams
: maksymalna liczba parametrów,int
: liczba przeanalizowanych parametrów,Funkcja opiera się na
String::indexOf()
iString::substring()
:A użycie jest bardzo proste:
źródło