Página 1 de 2

strchr localizar virgula e copiar o restante

MensagemEnviado: 12 Fev 2010 13:48
por cristian
simplesmente nao consigo fazer isso no mikroc sao 3horas perdidas

no ccs ...simples assim como a OI
Código: Selecionar todos
   arg1 = strchr( gpsread, ',' ) ; //Acha a vírgula.
   *(arg1)='\0' ; // Separa as strings.
   arg1++; // Aponta para o primeiro caractere.


PRONTO JA TENHO NO ARG1 TUDO Q TEM DEPOIS DA VIRGULA ATE O FINAL DA STRING

ni mikroc ele me retorna o ponteiro do endereço da string ...pra Q eu quero saber o endereço da string na RAM do pic ..isso é trabalho pro compilador ...



tentei varias formas a ultima foi essa no desespero mas nao funciona

Código: Selecionar todos
// strcpy(buffer,Buffer_gps); //copia a string
// res = strchr(buffer,',');//procura virgula
 
 //arg1 = Buffer[];
tipo=0;
for(x=0;x<=10;x++)
{
ch=buffer_gps[x];//copia o caractere
if(ch==',')tipo++;
switch(tipo)
{
case 1:
text[x]=ch;
break;
case 2:
Buffer_gsm[x]=ch;
break;
default:
tipo=0;
break;
}
}

MensagemEnviado: 12 Fev 2010 14:28
por RobL
Se voce tem o ponteiro para a string tem tudo.
Faça um
while (*ponteiro) // vai procurando até o final da string (\0)
if (encontrar ',')
{
faça o que quer ;
... ;
}
ponteiro++;

pode sair com
break;
ou o looping vai até encontrar \0 da string.
-------------
Sem usar função pronta para retornar ponteiro.
ponteiro *char ;
ponteiro = MinhaString ;// ponteiro aponta para inicio da string
e aplique o código acima

MensagemEnviado: 12 Fev 2010 15:36
por msamsoniuk
isso aqui nao resolve?

Código: Selecionar todos
strchr(char *p, char c)
{
  while(*p && *p!=c) p++;
  return p;
}


soh que o codigo que vc postou para o CCS tem um bug, o certo seria:

Código: Selecionar todos
arg1 = strchr(gpsread,','); // procura a virgula

if(arg1) // cuidado: arg1 == null indica q foi ateh o fim da string e nao achou
{
  *arg1++ = '\0'; // colocar zero e incrementa para apontar p/ o prox. caractere
  ...

MensagemEnviado: 12 Fev 2010 16:21
por cristian
nao deu muito certo nao Marcelo

fiz assim para em parte dar certo

Código: Selecionar todos
char  copia(char *p, char c)
{
  while(*p && *p!=c) p++;

  strcpy(buffer_gsm,p); //copia a string
  return *p;
}


com isso tenho tudo q esta depois da virgula ...mas o q estava antes como salvar

MensagemEnviado: 12 Fev 2010 16:56
por cristian
groseiramente este codigo fuincionou
Código: Selecionar todos
//---------------------------------- comando gps
if( flag.chegou_gps)
{
 flag.chegou_gps=0;

tipo=0;
ind=0;
 for(x=0;x<=2;x++)
{
ind2=0;
do
{

ch=buffer_gps[ind];//copia o caractere
Buffer_gsm[ind2]=ch;
ind++;
ind2++;
}while(ch!=',');
ind2--;
Buffer_gsm[ind2]='\0';
 // strcpy(text,Buffer_gps); //copia a string
switch(tipo)
{
case 0:

strcpy(text,Buffer_gsm); //copia a string
tipo=1;
break;
case 1:
tipo=2;
 strcpy(text2,Buffer_gsm); //copia a string
break;
case 2:
tipo=3;
 strcpy(text3,Buffer_gsm); //copia a string
break;
}
  }

MensagemEnviado: 12 Fev 2010 19:44
por Sergio38br
Cristian, vc quer pegar as infosda string GPRMC???, olha o mais facil é vc criar uma union , depois de salvar as info na array vc pode acessar mais facilmente, afinal o numero de virgulas naum mudam na sentença.

[ ]`s
Sergio

MensagemEnviado: 13 Fev 2010 01:36
por msamsoniuk
faltaram dois detalhes no meu strchr... um q eu esqueci de indicar q ele retorna um char *, outro q ele deve retornar NULL quando nao encontra o caractere, daih a implementacao correta e testada ficaria:

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

char *strchr(char *p, char c)
{
  while(*p && *p!=c) p++;
  return *p?p:NULL;
}

int main()
{
  char test[]="1,2,3,4";
  char *p,*q;

  for(p=q=test;q=strchr(q,',');p=q)
  {
    *q++=0;
    if(*p) printf("parametro: %s\n",p);
  } 
  if(*p) printf("parametro: %s\n",p);

  return 0;
}


no teste, ele imprime corretamente:

Código: Selecionar todos
parametro: 1
parametro: 2
parametro: 3
parametro: 4


testei variar tambem a entrada posicionando virgulas meio aleatoriamente e nao deu problemas.

como eu esqueci de indicar o char *, o seu compilador provavelmente colocou como int (o default) e entao vc tentou colocar apenas char e mudar para um return *p, o que na verdade nao funciona (tem q ser return p para retornar a string inteira). dae vc contornou com um strcpy, porem fica com uma copia para um buffer fixo, o q gera alguns problemas.

bom, dah uma analisada nessa versao com as correcoes.

cristian escreveu:nao deu muito certo nao Marcelo

fiz assim para em parte dar certo

Código: Selecionar todos
char  copia(char *p, char c)
{
  while(*p && *p!=c) p++;

  strcpy(buffer_gsm,p); //copia a string
  return *p;
}


com isso tenho tudo q esta depois da virgula ...mas o q estava antes como salvar

MensagemEnviado: 13 Fev 2010 15:16
por RobL
Solução mui elegante e funciona.

MensagemEnviado: 13 Fev 2010 22:02
por cristian
funcionou em parte tb agora ele separa todos os argumentos mas nao sai da rotina tipo assim

estou usando mikroc pro , falta algum detalhe

--gps--

par : 25 separou corretamente
par : 20
par : 30
par : 40
par : 1 //fica repetindo
par : 1
par : 1
par : 1
par : 1






Código: Selecionar todos
if( flag.chegou_gps)
{
 flag.chegou_gps=0;
 
    for(p=q=test;q=copia(q,',');p=q)
  {
    *q++=0;
    if(*p)
    {
      UART1_Write_text("par : ");
       UART1_Write_text(p);
        UART1_Write(13);
        UART1_Write(10);
     }

  }
  if(*p) UART1_Write_text("parametro: ");
          UART1_Write_text(p);
          UART1_Write(13);
          UART1_Write(10);

 }



Código: Selecionar todos
char *copia(char *p, char c)
{
  while(*p && *p!=c) p++;
 return *p?p:"";
}

MensagemEnviado: 13 Fev 2010 22:44
por msamsoniuk
eh que vc mudou algo essencial: trocou NULL por "", o que nao eh equivalente. se vc nao tem uma definicao para NULL, simplesmente coloque 0 no lugar de "":

return *p?p:0;

nao parece, mas faz toda a diferenca!

MensagemEnviado: 14 Fev 2010 08:31
por cristian
NULL nao foi reconhecido pelo mikroc e "" representa o NULL , coloquei 0 e deu erro "inconsistent type"

coloquei "\0" parou de repetir mas nao sai do laço for


return *p?p:0; erro "inconsistent type"

return *p?p:'\0'; erro "inconsistent type"

return *p?p:""; fica repetindo UART1_Write_text("par : ");

return *p?p:"\0"; o que melhor deu certo ate agora mas nao sai do laço for

MensagemEnviado: 14 Fev 2010 12:02
por Sergio38br
Cristian , me tira uma duvida, qdo vc recebe o sinal do gps ele ja vem como string, todos os caracteres são ASCII separados por virgulas entre os campos, tudo que estiver entre o "$" e o "*" são dados conforme o tipo de string, GPRMC, GPGGA, e as outras do NMEA. Qdo um campo é vazio . Ex. ainda não esta com o almanaque utilizavel alguns campos vem "vazios"duas virgulas em sequencia. então por que vc quer transformar uma string em string???

[ ]~s
Sergio

MensagemEnviado: 14 Fev 2010 12:03
por msamsoniuk
colocar "" ou "\0" dah na mesma e nao satisfaz o teste do for(), por isso ele nao consegue sair. tem q ser um ponteiro nulo mesmo. se o micro-c nao aceita NULL nem 0 diretamente, vc pode tentar colocar um cast:

Código: Selecionar todos
char *strchr(char *p, char c)
{
  while(*p && *p!=c) p++;
 return *p?p:(char *)0;
}


se nao funcionar, vc vai ter q ver com os especialistas em micro-c ae no forum como fabricar um ponteiro NULL no micro-c.

MensagemEnviado: 14 Fev 2010 17:49
por cristian
Marcelo agradeço muito sua ajuda, mas mesmo assim nao funcionou....


Sergio , nao quero transformar string em string , so quero separar o que é latitude longetude etc....como toda sentença é separada por virgula nao importa o tamanho , e quando nao exixte vem vazio ( ,, )emtao se emtre uma virgula e outra nao tiver nada sei q esta vazia

esta é uma senteça q estou usando

$GPGGA,123956.983,1139.2903,S,03900.0478,W,1,10,0.9,388.7,M,-11.6,M,,0000*7F tenho q separar

$GPGGA, //tipo de mensagem
123956.983,//hora utc
1139.2903,S,// lat
03900.0478,W,//long
1,10,0.9,388.7,M,-11.6,
nao lenbro agora o restante

vou fazer um teste agora mais apurado , se mesmo q nao existam os valores for recebidos zeros ou seja a string ter o mesmo tamanho sempre vou simplesmente usar indices para buscar o q quero

mais tarde posto a msg

MensagemEnviado: 14 Fev 2010 20:47
por ivan
Cristian,

Se vc ainda estiver usando este fragmento de código abaixo:
Código: Selecionar todos
for(p=q=test;q=copia(q,',');p=q)
{
   ...
}


Falta o termo de comparação na 2a expressão do for. Neste exemplo q vc colocou só tem atribuição "=", comparação seria:
==
<=
>=
>
<
...