Olá, estou pretendendo criar uma aplicação em C, onde envio dados para o Arduino através da porta serial, porem, como terei acionamento de 4 relés diferentes, estive pensando em enviar uma string como "XX|XX|XX|XX", onde cada XX representa o tempo de acionamento de um determinado relé, por exemplo, para manter o relé 2 fechado por 10 segundos, enviaria algo como XX|10|XX|XX, precisaria então, que o ardiuino tratasse a string recebida , para transformá-la, por exemplo, em um array de 4 elementos, que me retornasse algo como string[0]=>XX,string[1]=>10,string[2]=>XX,string[3]=>XX, porem que sempre fizesse esta divisão em um marcador definido, como o " | " utilizado no exemplo, assim mesmo que ele envie um valor de 1,4,10 digitos,como XXXXX|XX|XXX|X, ele consiga separar em 4 elementos. Em php uso a função explode(), em javascript uso split(), porem, não sei como posso fazer isto no arduino.
Algo como isto?
http://www.cplusplus.com/reference/clibrary/cstring/strtok/
Esta funcão está disponível no Arduino. No entanto, para o que pretendes, talvez seja mais eficiente criares tu código que faca o "parsing" da string. A razão para isto é que o Serial recebe os dados para um buffer, mas não está acessível para ti. Então ias ter de passar os dados para outro buffer caracter a caracter... e depois criar outro buffer ainda para guardar os valores separados. Tudo isto vai ocupar espaco em memória...
Lembra-te também de incluir um delimitador de principio e fim, por exemplo, <XX|XX|XX|XX> assim podes confirmar que recebeste uma trama completa.
Mais logo meto uma funcão que faca isso. Não é difícil fazer uma funcão para isso e se quiseres, podes usar a strtok, o problema é mesmo na eficiência da memória e se tiveres uma aplicacão já grande podes vir a ter problemas.
Entendi, tentarei isto quando chegar em casa, porem, como pode ocupar mais memória, tentarei diminuir os dados, algo como <XX|XX>, onde o primeiro XX seria o numero do relé a ser acionado, e o segundo XX seria o tempo de acionamento.Assim quem sabe me diminuiria um pouco o consumo de memória.
LOL
lordskynner:
Entendi, tentarei isto quando chegar em casa, porem, como pode ocupar mais memória, tentarei diminuir os dados, algo como <XX|XX>, onde o primeiro XX seria o numero do relé a ser acionado, e o segundo XX seria o tempo de acionamento.Assim quem sabe me diminuiria um pouco o consumo de memória.
Isso não interfere na memória... interfere na velocidade de transmissão porque estás a duplicar o número de dados que tens de enviar.
Não vou compilar, mas deves conseguir ficar com uma ideia.
int valores[4];
int ptr_valor;
int temp_val[6]; // como é int, vamos imaginar que podemos receber 32327 (ou algo do género)
for (int i = 0; i < 4; i++) { //isto é para sabermos qual é o valor que recebemos.
if (Serial.read() == '<') { //início de trama.
ptr_valor = 0;
while ((temp_val[ptr_valor] = Serial.read()) != '|')
{
ptr_valor++; //passar para o próximo caracter.
}
//quando sairmos deste ciclo, temos um valor.
++ptr_valor = '\0'; //terminar a string, né?
valores[i] = atoi(temp_valor);//converter de string para inteiro.
}
else { //deve ter havido um erro
//tratar do erro...
//isto é para ti
}
Espero ter ajudado. Eu não compilei nem testei, logo... pode estar errado.