duvida ler string

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

duvida ler string

Mensagempor roquetti » 08 Abr 2011 23:54

Como faço para que no switch eu leia a string "A180"?

int a;
void main () {
unsigned char dt[4];

TRISA = 0; //define porta como saida
PORTA = 0; //resseta todos os pinos do port
TRISB = 0; //define porta como saida
TRISB.RB1=1;
TRISB.RB2=1;
PORTB = 0; //resseta todos os pinos do port


Uart1_Init(9600);

do {
if (Uart1_Data_Ready()) { //verifica se algum byte chegou no buffer serial
dt[0] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[1] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[2] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[3] = Uart1_Read(); //lê o byte do buffer e salva na variável dt

}

switch(dt) {
case "A180": //.
for( a=0; a<15;a++){
PORTA.RA0 = 1; //extrema esquerda
delay_ms(2);
PORTA.RA0 = 0;
delay_ms(18); }
break; //finaliza a condição case
case "A005": //
for( a=0; a<15;a++){
PORTA.RA0 = 1; //extrema direita
delay_ms(1);
PORTA.RA0 = 0;
delay_ms(19); }
break;
case "A120": //
for( a=0; a<15;a++){
PORTA.RA0 = 1; //120º
delay_ms(1);
delay_us(200);
PORTA.RA0 = 0;
delay_ms(18);
delay_us(800);}
break;
}
} while(1);
}
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor ivan » 09 Abr 2011 08:29

Vc vai ter q tentar algo nesta linha...

Código: Selecionar todos
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  const char *p1 = "A180";
  const char *p2 = "A120";
  const char *p3 = "A110";
  const int ip1 = (int)(p1[0] + p1[1] + p1[2] + p1[3] ),
      ip2 = (int)(p2[0]+p2[1]+p2[2]+p2[3]),
      ip3 = (int)(p3[0]+p3[1]+p3[2]+p3[3]);
  int ptr = 0, i;
  for(i=0;i<4;i++)   {
          ptr += *(p2+i);
  }
 
  printf("ptr=%d\n", ptr);
  printf("ip1=%d\n", ip1);
 
  switch(ptr) {
             case 218:    {
                  printf("p1=ptr=%s\n", p1);
                  break;
             }
             case 212:    {
                  printf("p2=ptr=%s\n", p2);
                  break;
             }
             case 211:
                  printf("p3=ptr=%s\n", p3);
  }
  system("PAUSE");   
  return 0;
}
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Re: duvida ler string

Mensagempor andre_luis » 09 Abr 2011 09:04

Não ficou claro o teor do problema.

O que voce fez não funciona ?
O que ocorre ou deveria ocorrer exatamente ?

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor roquetti » 09 Abr 2011 09:50

como consigo fazer este if?

if (Uart1_Data_Ready()) { //verifica se algum byte chegou no buffer serial
dt[0] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[1] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[2] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[3] = Uart1_Read(); //lê o byte do buffer e salva na variável dt

}
if (&dt[0]==A && &dt[1]==1 && &dt[2]==8 && &dt[3]==0 ){
( este daqui!!)

estou tentando saber o que tem dentro de cada dt[] para saber se está vindo certo pela serial.
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor Rodrigo_P_A » 09 Abr 2011 10:23

roquetti escreveu:como consigo fazer este if?

if (Uart1_Data_Ready()) { //verifica se algum byte chegou no buffer serial
dt[0] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[1] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[2] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[3] = Uart1_Read(); //lê o byte do buffer e salva na variável dt

}
if (&dt[0]==A && &dt[1]==1 && &dt[2]==8 && &dt[3]==0 ){
( este daqui!!)

estou tentando saber o que tem dentro de cada dt[] para saber se está vindo certo pela serial.


O erro é que vc num está verificando se tem dado antes de ler cada byte, seguindo teu pensamento e para ficar mais fácil pra vc entender faça:


if (Uart1_Data_Ready()) dt[0] = Uart1_Read();
if (Uart1_Data_Ready()) dt[1] = Uart1_Read();
if (Uart1_Data_Ready()) dt[2] = Uart1_Read();
if (Uart1_Data_Ready()) dt[3] = Uart1_Read();
//leu 4 bytes
// agora vc verifica o que tem na string
if (dt[0]=='A' && dt[1]=='1' && dt[2]=='8' && dt[3]=='0' ){
}

outro erro está no if, você está comparando o endereço na memória &dt[0] se é igual a A e você está usando A sem aspas simples.

o certo é comparar como eu fiz acima, já que vc quer comprar um valor em ASCII.

para ler o conteúdo da matriz não precisa usar o &
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: duvida ler string

Mensagempor msamsoniuk » 09 Abr 2011 12:41

pq nao funciona eh obvio: a linguagem C soh faz operacoes "atomicas" em operandos simples (char, short, long, etc) e switch nao permite case com operandos compostos, como strings.

para ler strings, eu faria diferente:

Código: Selecionar todos
char getchar()
{
  while(!Uart1_Ready())
  {
    return Uart1_Read();
  }
}

int gets(char *string)
{
  int i,j;
  while(1) {
    j = getchar();
    if(j=='\n') break;
    string[i++] = j;
  }
  string[i] = 0;
  return i;
}

int main() {
 
  char buffer[40];

  while(gets(buffer))
  {
    if(!strcmp(buffer,"comando1"))
    {
     
    }
    else
    if(!strcmp(buffer, "comando2"))
    {
    }
    ...
  }
}


tem um bug de buffer overflow no gets(), mas nao eh importante agora! :)

aqui tem um codigo completinho de prompt de comando:

http://framework.sourceforge.net/hc908s ... ll/shell.c

eh para outro mcu, mas nao deve ser dificil adaptar para pic.

andre_teprom escreveu:Não ficou claro o teor do problema.

O que voce fez não funciona ?
O que ocorre ou deveria ocorrer exatamente ?

+++
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Re: duvida ler string

Mensagempor roquetti » 09 Abr 2011 13:46

Refiz o código, consigo enviar um carcter pelo PC via serial RS232 para a placa com o PIC16F628A, mas uma palavra assim: A180 não sei se estou recebendo corretamente

int a;
unsigned char i;


void main () {
unsigned char dt[4+1];
dt[4] = '\0';

TRISA = 0; //define porta como saida
PORTA = 0; //resseta todos os pinos do port
TRISB = 0; //define porta como saida
TRISB.RB1=1;
TRISB.RB2=1;
PORTB = 0; //resseta todos os pinos do port


Uart1_Init(9600);

do {
if (Uart1_Data_Ready()) { //verifica se algum byte chegou no buffer serial
dt[0] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[1] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[2] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[3] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
}

if (dt[0]=='A' && dt[1]==1 && dt[2]==8 && dt[3]==0 ){
for( a=0; a<15;a++){
PORTA.RA0 = 1; //extrema esquerda
delay_ms(2);
PORTA.RA0 = 0;
delay_ms(18); }}
//break; //finaliza a condição case
if (dt[0]=='A' && dt[1]==0 && dt[2]==0 && dt[3]==1 ){
for( a=0; a<15;a++){
PORTA.RA0 = 1; //extrema direita
delay_ms(1);
PORTA.RA0 = 0;
delay_ms(19); }
}

else {
for( a=0; a<15;a++){
PORTA.RA0 = 1; //acende o led
delay_ms(1);
delay_us(200);
PORTA.RA0 = 0;
delay_ms(18);
delay_us(800);}

}

} while(1);
}
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Re: duvida ler string

Mensagempor Rodrigo_P_A » 09 Abr 2011 18:03

roquetti escreveu:Refiz o código, consigo enviar um carcter pelo PC via serial RS232 para a placa com o PIC16F628A, mas uma palavra assim: A180 não sei se estou recebendo corretamente

int a;
unsigned char i;


void main () {
unsigned char dt[4+1];
dt[4] = '\0';

TRISA = 0; //define porta como saida
PORTA = 0; //resseta todos os pinos do port
TRISB = 0; //define porta como saida
TRISB.RB1=1;
TRISB.RB2=1;
PORTB = 0; //resseta todos os pinos do port


Uart1_Init(9600);

do {
if (Uart1_Data_Ready()) { //verifica se algum byte chegou no buffer serial
dt[0] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[1] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[2] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
dt[3] = Uart1_Read(); //lê o byte do buffer e salva na variável dt
}

if (dt[0]=='A' && dt[1]==1 && dt[2]==8 && dt[3]==0 ){
for( a=0; a<15;a++){
PORTA.RA0 = 1; //extrema esquerda
delay_ms(2);
PORTA.RA0 = 0;
delay_ms(18); }}
//break; //finaliza a condição case
if (dt[0]=='A' && dt[1]==0 && dt[2]==0 && dt[3]==1 ){
for( a=0; a<15;a++){
PORTA.RA0 = 1; //extrema direita
delay_ms(1);
PORTA.RA0 = 0;
delay_ms(19); }
}

else {
for( a=0; a<15;a++){
PORTA.RA0 = 1; //acende o led
delay_ms(1);
delay_us(200);
PORTA.RA0 = 0;
delay_ms(18);
delay_us(800);}

}

} while(1);
}


se o código for esse acima, vc nem leu o post que eu escrevi.!
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor barboza » 09 Abr 2011 19:19

Paulo,

Você recebeu e tentou a opção que mandei no grupo do embarcados?

1 - Definindo uma matriz com as opções que pode receber, uma função para comparar o que recebeu e buscar na matriz a opção, retorna o indice se achou ou (-1) se não, e tenta o retorno no switch/case;

2 - Leia a sub-string "001" a "180", converta o valor com atoi e testa no switch/case;

Mas antes disso, você precisa resolver o recebimento da string completa corretamente.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Re: duvida ler string

Mensagempor andre_luis » 09 Abr 2011 19:58

roquetti escreveu:...não sei se estou recebendo corretamente...


E como podemos saber ?

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: duvida ler string

Mensagempor roquetti » 09 Abr 2011 20:52

Rodrigo, tentei do seu modo e não funcionou, está funcionando pelo menosuma vez, deste modo aqui, caso necessite ler outro valor tenho que resetar a placa

while(1){

char idx = 0;
while (1){
while( ! Uart1_Data_Ready() )
{
}
dt[idx] = Uart1_Read();
++idx;
if( idx == 4 )
{
break;
}
}

if (dt[0]=='A'&& dt[1]=='1' && dt[2]=='8' && dt[3]=='0'){
for( a=0; a<15;a++){
PORTA.RA0 = 1; //extrema esquerda
delay_ms(2);
PORTA.RA0 = 0;
delay_ms(18); }
}

if (dt[0]=='A' && dt[1]=='0' && dt[2]=='0' && dt[3]=='1' ){
for( a=0; a<15;a++){
PORTA.RA0 = 1; //extrema direita
delay_ms(1);
PORTA.RA0 = 0;
delay_ms(19); }
}

if (dt[0]=='A' && dt[1]=='1' && dt[2]=='2' && dt[3]=='0' ){
for( a=0; a<15;a++){
PORTA.RA0 = 1; //angulo 120 graus
delay_ms(1);
delay_us(200);
PORTA.RA0 = 0;
delay_ms(18);
delay_us(800);}
}



}
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor guest2003 » 10 Abr 2011 08:59

Roquetti,

So funciona uma vez porque voce nao reinicializa a variavel idx

Na primeira vez ela vai de 0 a 3... na seguinte 4 a 7 (ai ja ferrou) e assim por diante...

Eu particularmente nao gosto de construcoes com break... mas nao vem ao caso.

So uso while(1) quando realmente nunca mais for sair deste laço...

No seu caso por exemplo, vc vai sair quando idx==4 entao faca o while( idx<4 )

outra coisa, para o loop infinito eu prefiro for( ;; ) pois assim o compilador nao gera warning. (ele sabe que vc quer fazer um loop infinito mesmo)

[]'s
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor guest2003 » 10 Abr 2011 09:02

so uma coisa...

Use a opcao CODE aqui do forum para seu codigo nao perder identação... pois fica muito ruim de ler se nao estiver identado.

[]'s
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x