Loading...
Pages: [1]   Go Down
Author Topic: Dividindo Strings recebidas pelo arduino  (Read 475 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

'round the world...
Offline Offline
Edison Member
*
Karma: 20
Posts: 2308
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

'round the world...
Offline Offline
Edison Member
*
Karma: 20
Posts: 2308
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

LOL

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.

Code:


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.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Pages: [1]   Go Up
Print
 
Jump to: