Dividindo Strings recebidas pelo arduino

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.