Página 1 de 2
strchr localizar virgula e copiar o restante

Enviado:
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;
}
}

Enviado:
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

Enviado:
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
...

Enviado:
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

Enviado:
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;
}
}

Enviado:
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

Enviado:
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

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

Enviado:
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:"";
}

Enviado:
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!

Enviado:
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

Enviado:
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

Enviado:
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.

Enviado:
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

Enviado:
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:
==
<=
>=
>
<
...