collapse

* Links de Robótica

* Posts Recentes

Feira de electricidade e eletrónica por artur36
[Ontem às 23:07]


Power_OK Enermax por almamater
[Ontem às 12:10]


Recomendação de um opamp para um DAC r2r por jm_araujo
[23 de Novembro de 2017, 10:48]


RN42 e TP-Link MR3020 por doiga
[22 de Novembro de 2017, 19:22]


Ajuda Projecto IR / RF por senso
[22 de Novembro de 2017, 13:15]


Ideias para construir um quadrúpede simples por dropes
[21 de Novembro de 2017, 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]

Autor Tópico: Problema em trama serie  (Lida 936 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline elfo106

  • Mini Robot
  • *
  • Mensagens: 114
Problema em trama serie
« em: 16 de Março de 2015, 22:00 »
Olá a todos,

É a primeira vez que estou a usar arduino, essencialmente para validar hardware mas estou com uma dificuldade. Alguém me dá uma ajudinha?

Estou a enviar uma trama por comunicação serie para um lcd c/ touch. Acontece que na palavra que eu estou a receber no ecrã, falta sempre a ultima letra.

Exemplo:

Se no código escrevo "teste" no ecrã aparece "test", mas se escrever "teste " então já recebo "teste".

Um bocadinho de código para ajudar...

Código: [Seleccione]
void TC3_Handler()
{
 
  TC_GetStatus(TC1, 0);

  state="Soak";
   
  state.getBytes(state_lcd,state.length());
       
  byte state_lcd_length = state.length();

  for(int i=0; i<state_lcd_length; i++)
  {
    xor_state_lcd = xor_state_lcd ^ state_lcd[i];
  }
     
  byte checksum_state_lcd = 0x02 ^ 0x00 ^ state_lcd_length ^ xor_state_lcd;
  byte message_legenda_lcd[] = {0x02, 0x00, state_lcd_length, state_lcd[0], state_lcd[1], state_lcd[2], state_lcd[3],checksum_state_lcd};
  Serial.write(message_legenda_lcd,sizeof(message_legenda_lcd));
}

Descobri, com recurso a um analisador lógico, que na message_legenda_lcd[] = {...}, o último byte antes do checksum é sempre 0x00 (não sei porquê..). Resumindo, nesse caso especifico, por alguma razão, em vez de ter o byte correspondente à letra 'k' no state_lcd[3], tenho 0x00, resultando em "Soa".

Se usasse state="Soak ", teria mais um caractere, e então state_lcd[3] seria 'k' e state_lcd[4] tomava o valor de 0x00. (também já verifiquei esta situação)

O que me está a falhar neste código para me acontecer isto??

Obrigado a todos!

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: Problema em trama serie
« Responder #1 em: 16 de Março de 2015, 22:17 »
Se queres a palavra toda, tens de iterar até ao length e não length menos 1, porque estás a fazer i<length e não i==length.

Ou então mete um \n no fim da palavra, mas é suposto ele já o fazer com strings..
Mas atenção que todo esse texto fica pendurado na RAM, usa progmem para não usares a RAM toda com meia duzia de palavras.
Avr fanboy

Offline elfo106

  • Mini Robot
  • *
  • Mensagens: 114
Re: Problema em trama serie
« Responder #2 em: 16 de Março de 2015, 22:37 »
isso do i<length é para o checksum...está a interferir?

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.141
    • Tróniquices
Re: Problema em trama serie
« Responder #3 em: 16 de Março de 2015, 22:58 »
Experimenta imprimir "pó ecran" o valor dos bytes [ 0] a [3], em char e em int. E vê melhor a documentação do tipo dessa variável state_lcd, se calhar estás a usá-la de forma incorrecta.
« Última modificação: 16 de Março de 2015, 22:59 por Njay »

Offline elfo106

  • Mini Robot
  • *
  • Mensagens: 114
Re: Problema em trama serie
« Responder #4 em: 17 de Março de 2015, 00:56 »
Assim o fiz mas não consegui fazer print dentro da interrupção do timer.

Cortei aquele bocado de código e coloquei-o no "loop"

Resultado:
state_lcd[0]  -> 83   S
state_lcd[1]  -> 111   o
state_lcd[2]  -> 97   a
state_lcd[3]  -> 0   " "

Eu já percebi o que estava mal.

Ao fazer state.getBytes(state_lcd,state.length()); , pensei que já me devolvia o tamanho com o /n e pelos vistos não. Por essa razão a função getBytes substituía o meu ultimo caractere pela terminação. Precisei de alterar para state.getBytes(state_lcd,state.length()+1); e o problema ficou resolvido.

Obrigado aos dois!