Estoy enviando una lista de posiciones de servo a través de la conexión en serie al arduino en el siguiente formato
1:90&2:80&3:180
Que se analizaría como:
servoId : Position & servoId : Position & servoId : Position
¿Cómo dividiría estos valores y los convertiría en un entero?
serial
arduino-mega
string
ValrikRobot
fuente
fuente
Respuestas:
Contrariamente a otras respuestas, prefiero alejarme
String
por las siguientes razones:En un entorno integrado como Arduino (incluso para un Mega que tiene más SRAM), prefiero usar las funciones estándar de C :
strchr()
: busca un carácter en una cadena C (es decirchar *
)strtok()
: divide una cadena C en subcadenas, en función de un carácter separadoratoi()
: convierte una cadena C en unint
Eso llevaría al siguiente ejemplo de código:
La ventaja aquí es que no tiene lugar una asignación dinámica de memoria; incluso puede declarar
input
como una variable local dentro de una función que leería los comandos y los ejecutaría; una vez que se devuelve la función,input
se recupera el tamaño ocupado por (en la pila).fuente
Esta función se puede usar para separar una cadena en pedazos según el carácter separador.
Convertir cadena a int
Este fragmento de código toma una cadena y la separa en función de un carácter dado y devuelve el elemento entre el carácter separador
fuente
Podría hacer algo como lo siguiente, pero tenga en cuenta varias cosas:
Si lo usa
readStringUntil()
, esperará hasta que reciba el carácter o los tiempos de espera. Por lo tanto, con su cadena actual, la última posición durará un poco más, ya que tiene que esperar. Puede agregar un final&
para evitar este tiempo de espera. Puede verificar fácilmente este comportamiento en su monitor, intente enviar la cadena con y sin el extra&
y verá tal retraso de tiempo de espera.En realidad no es necesario el índice de servo, que sólo puede enviar su serie de posiciones, y obtener el índice de servo por la posición de valor en la cadena, algo así como:
90&80&180&
. Si usa el índice de servo, tal vez desee verificarlo (convertir aint
, y luego hacer coincidir el índice de bucle i) para asegurarse de que nada salió mal con su mensaje.Debe verificar que la cadena de retorno de
readStringUntil
no esté vacía. Si la función expira, no recibió suficientes datos y, por lo tanto, cualquier intento de extraer susint
valores producirá resultados extraños.fuente
Puede usar
Stream.readStringUntil(terminator)
pasar un terminador diferente para cada parte.En cada parte entonces llamas
String.toInt
fuente
La solución más simple es usar sscanf () .
Esto da el siguiente resultado:
¡Salud!
fuente
invalid conversion from 'int' to 'char*' [-fpermissive]
Ver ejemplo en: https://github.com/BenTommyE/Arduino_getStringPartByNr
fuente
fuente
jfpoilpret proporcionó una excelente respuesta para analizar el comando en serie en Arduino. Sin embargo, Attiny85 no tiene serial bidireccional: se debe usar SoftwareSerial. Así es como se transfiere el mismo código para Attiny85
Esquemas Attiny85 para números de pin
Sketch compila en:
Entonces hay mucho espacio y memoria para el resto del código
fuente
Arduino
palabras clave y, a veces, se encuentran en situaciones muy difíciles, ya que implementar el código Arduino en Attiny no siempre es trivial. Tuve que convertir el código original para que funcionara en Attiny, lo probé y decidió compartirlofuente
fuente
Aquí está el método Arduino para dividir una cadena como respuesta a la pregunta "¿Cómo dividir una cadena en una subcadena?" declarado como un duplicado de la presente pregunta.
El objetivo de la solución es analizar una serie de posiciones GPS registradas en un archivo de tarjeta SD . En lugar de recibir una Cadena
Serial
, la Cadena se lee del archivo.La función es
StringSplit()
analizar una CadenasLine = "1.12345,4.56789,hello"
a 3 CadenassParams[0]="1.12345"
,sParams[1]="4.56789"
ysParams[2]="hello"
.String sInput
: las líneas de entrada a analizar,char cDelim
: el carácter delimitador entre parámetros,String sParams[]
: la matriz de salida de parámetros,int iMaxParams
: el número máximo de parámetros,int
: el número de parámetros analizados,La función se basa en
String::indexOf()
yString::substring()
:Y el uso es realmente simple:
fuente