Página 1 de 1

duvida ler string

MensagemEnviado: 08 Abr 2011 23:54
por roquetti
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);
}

MensagemEnviado: 09 Abr 2011 08:29
por ivan
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;
}

Re: duvida ler string

MensagemEnviado: 09 Abr 2011 09:04
por andre_luis
Não ficou claro o teor do problema.

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

+++

MensagemEnviado: 09 Abr 2011 09:50
por roquetti
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.

MensagemEnviado: 09 Abr 2011 10:23
por Rodrigo_P_A
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 &

Re: duvida ler string

MensagemEnviado: 09 Abr 2011 12:41
por msamsoniuk
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 ?

+++

Re: duvida ler string

MensagemEnviado: 09 Abr 2011 13:46
por roquetti
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);
}

Re: duvida ler string

MensagemEnviado: 09 Abr 2011 18:03
por Rodrigo_P_A
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.!

MensagemEnviado: 09 Abr 2011 19:19
por barboza
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.

Re: duvida ler string

MensagemEnviado: 09 Abr 2011 19:58
por andre_luis
roquetti escreveu:...não sei se estou recebendo corretamente...


E como podemos saber ?

+++

Re: duvida ler string

MensagemEnviado: 09 Abr 2011 20:52
por roquetti
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);}
}



}

MensagemEnviado: 10 Abr 2011 08:59
por guest2003
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

MensagemEnviado: 10 Abr 2011 09:02
por guest2003
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