J'envoie une liste de positions d'asservissement via la connexion série à l'arduino au format suivant
1:90&2:80&3:180
Ce qui serait analysé comme:
servoId : Position & servoId : Position & servoId : Position
Comment pourrais-je fractionner ces valeurs et les convertir en un entier?
serial
arduino-mega
string
ValrikRobot
la source
la source
Réponses:
Contrairement à d’autres réponses, je préférerais rester à l’écart
String
pour les raisons suivantes:Dans un environnement embarqué tel qu'Arduino (même pour un Mega disposant de davantage de SRAM), je préférerais utiliser les fonctions C standard :
strchr()
: rechercher un caractère dans une chaîne C (iechar *
)strtok()
: divise une chaîne C en sous-chaînes, en fonction d'un caractère séparateuratoi()
: convertit une chaîne C en unint
Cela conduirait à l'exemple de code suivant:
L'avantage ici est qu'aucune allocation de mémoire dynamique n'a lieu; vous pouvez même déclarer
input
une variable locale dans une fonction qui lirait les commandes et les exécuterait; une fois que la fonction est retournée, la taille occupée parinput
(dans la pile) est récupérée.la source
Cette fonction peut être utilisée pour séparer une chaîne en morceaux en fonction du caractère de séparation.
Convertir une chaîne en int
Ce morceau de code prend une chaîne et la sépare en fonction d'un caractère donné, puis renvoie l'élément entre le caractère séparateur.
la source
Vous pouvez faire quelque chose comme ce qui suit, mais veuillez prendre en compte plusieurs choses:
Si vous utilisez
readStringUntil()
, il attendra de recevoir le caractère ou les délais. Ainsi, avec votre chaîne actuelle, la dernière position durera un peu plus longtemps, car elle doit attendre. Vous pouvez ajouter une fin&
pour éviter ce délai. Vous pouvez facilement vérifier ce comportement sur votre moniteur, essayer d’envoyer la chaîne avec et sans l’extra&
et vous verrez un tel délai.En fait , vous n'avez pas besoin de l'indice servo, vous pouvez envoyer votre chaîne de positions et obtenir l'indice servo par la position de valeur dans la chaîne, quelque chose comme:
90&80&180&
. Si vous utilisez le servo-index, vous voudrez peut-être le vérifier (convertir enint
, puis faire correspondre l'index de boucle i) pour vous assurer que votre message n'a pas mal tourné.Vous devez vérifier que la chaîne renvoyée par
readStringUntil
n'est pas vide. Si la fonction a expiré, vous n'avez pas reçu suffisamment de données et toute tentative d'extraction de vosint
valeurs produira des résultats étranges.la source
Vous pouvez utiliser
Stream.readStringUntil(terminator)
un terminateur différent pour chaque partie.Sur chaque partie, vous appelez ensuite
String.toInt
la source
La solution la plus simple consiste à utiliser sscanf () .
Cela donne la sortie suivante:
À votre santé!
la source
invalid conversion from 'int' to 'char*' [-fpermissive]
Voir l'exemple à: https://github.com/BenTommyE/Arduino_getStringPartByNr
la source
la source
jfpoilpret a fourni une excellente réponse pour l'analyse de la commande série sur Arduino. Cependant, Attiny85 n’a pas de série bidirectionnelle - SoftwareSerial doit être utilisé. C’est ainsi que vous portez le même code pour Attiny85
Schémas Attiny85 pour les numéros de broches
Sketch compile en:
Donc, il y a beaucoup d'espace et de mémoire pour le reste du code
la source
Arduino
mots clés et se retrouvent parfois dans des situations très délicates, car implémenter du code Arduino sur Attiny n'est pas toujours trivial. Devait convertir le code original pour pouvoir travailler sur Attiny, l’essayer et décider de le partagerla source
la source
Voici la méthode Arduino pour diviser une chaîne en réponse à la question "Comment diviser une chaîne en sous-chaîne?" déclarée comme un duplicata de la présente question.
L'objectif de la solution est d'analyser une série de positions GPS enregistrées dans un fichier de carte SD . Au lieu d'avoir une chaîne reçue de
Serial
, la chaîne est lue à partir d'un fichier.La fonction consiste à
StringSplit()
analyser une chaînesLine = "1.12345,4.56789,hello"
en 3 chaînessParams[0]="1.12345"
,sParams[1]="4.56789"
&sParams[2]="hello"
.String sInput
: les lignes d’entrée à analyser,char cDelim
: le caractère séparateur entre les paramètres,String sParams[]
: le tableau de sortie en sortie de paramètres,int iMaxParams
: le nombre maximum de paramètres,int
: le nombre de paramètres analysés,La fonction est basée sur
String::indexOf()
etString::substring()
:Et l'utilisation est vraiment simple:
la source