Estou enviando uma lista de posições servo através da conexão serial ao arduino no seguinte formato
1:90&2:80&3:180
Qual seria analisado como:
servoId : Position & servoId : Position & servoId : Position
Como eu dividir esses valores e convertê-los em um número inteiro?
serial
arduino-mega
string
ValrikRobot
fonte
fonte
Respostas:
Ao contrário de outras respostas, prefiro ficar longe
String
pelas seguintes razões:Em um ambiente incorporado como o Arduino (mesmo para um Mega com mais SRAM), prefiro usar as funções C padrão :
strchr()
: procura um caractere em uma string C (ou sejachar *
)strtok()
: divide uma string C em substrings, com base em um caractere separadoratoi()
: converte uma string C em umint
Isso levaria ao seguinte exemplo de código:
A vantagem aqui é que não ocorre alocação dinâmica de memória; você pode até declarar
input
como uma variável local dentro de uma função que lê os comandos e os executa; Depois que a função é retornada, o tamanho ocupado porinput
(na pilha) é recuperado.fonte
Esta função pode ser usada para separar uma sequência em partes com base no que é o caractere de separação.
Converter String em int
Esse pedaço de código pega uma string e a separa com base em um determinado caractere e retorna O item entre o caractere de separação
fonte
Você pode fazer algo como o seguinte, mas leve em consideração várias coisas:
Se você usar
readStringUntil()
, ele esperará até receber o personagem ou os tempos limites. Assim, com sua string atual, a última posição durará um pouco mais, pois ela terá que esperar. Você pode adicionar um final&
para evitar esse tempo limite. Você pode facilmente verificar esse comportamento no seu monitor, tentar enviar a string com e sem o extra&
e verá esse atraso de tempo limite.Você realmente não precisa o índice de servo, você pode simplesmente enviar sua seqüência de posições, e obter o índice servo pela posição de valor na cadeia, algo como:
90&80&180&
. Se você usar o índice servo, talvez queira verificá-lo (converter paraint
e depois corresponder ao índice de loop i) para garantir que nada deu errado com sua mensagem.Você deve verificar se a sequência de retorno de
readStringUntil
não está vazia. Se a função atingir o tempo limite, você não recebeu dados suficientes e, portanto, qualquer tentativa de extrair seusint
valores produzirá resultados estranhos.fonte
Você pode usar a
Stream.readStringUntil(terminator)
passagem de um terminador diferente para cada parte.Em cada parte você chama então
String.toInt
fonte
A solução mais simples é usar sscanf () .
Isso fornece a seguinte saída:
Felicidades!
fonte
invalid conversion from 'int' to 'char*' [-fpermissive]
Veja o exemplo em: https://github.com/BenTommyE/Arduino_getStringPartByNr
fonte
fonte
O jfpoilpret forneceu uma ótima resposta para analisar o comando serial no Arduino. No entanto, o Attiny85 não possui serial bidirecional - o SoftwareSerial deve ser usado. É assim que você porta o mesmo código para o Attiny85
Esquemas Attiny85 para números de pinos
O esboço é compilado em:
Portanto, há muito espaço e memória para o restante do código
fonte
Arduino
palavras-chave e às vezes entram em situações muito complicadas, pois a implementação do código do Arduino no Attiny nem sempre é trivial. Teve que converter o código original para o trabalho em ATTINY, testou-o a trabalhar e decidi compartilhá-lofonte
fonte
Aqui está o método Arduino para dividir uma String como resposta à pergunta "Como dividir uma string em substring?" declarado como duplicado da presente questão.
O objetivo da solução é analisar uma série de posições de GPS registradas em um arquivo de cartão SD . Em vez de receber uma String de
Serial
, a String é lida do arquivo.A função é
StringSplit()
analisar uma StringsLine = "1.12345,4.56789,hello"
para 3 StringssParams[0]="1.12345"
,sParams[1]="4.56789"
&sParams[2]="hello"
.String sInput
: as linhas de entrada a serem analisadas,char cDelim
: o caractere delimitador entre os parâmetros,String sParams[]
: a matriz de saída dos parâmetros,int iMaxParams
: o número máximo de parâmetros,int
: o número de parâmetros analisados,A função é baseada em
String::indexOf()
eString::substring()
:E o uso é realmente simples:
fonte