String auslesen
Montag, 21. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  CCS Compiler  |  Schnittstellen (CCS)  |  String auslesen « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: String auslesen  (Gelesen 3272 mal)
 
maksim
Newbie
*
Offline Offline

Beiträge: 9


Profil anzeigen
« am: April 15, 2008, 06:44:00 »

Hallo,

bin neu hier und hab natürlich gleich mal ein Problem gerade was das Empfangen von mehreren Bytes angeht. Ich möchte nämlich ein String von einer GPS-Maus(Baudrate4800) auslesen, überprüfen ob das der Richtige ist und an den PC Baudrate9600) weiterschicken. Ich diesem Programm wird nur ein String ausgelesen und weitergeschickt, also ohne überprüfung. Leider funktioniert das Programm irgendwie nicht. Vielleicht kann mir jemand weiterhelfen. Habe das Programm ohne der GPS Maus getestet, also eingetippte tasten vom PC einlesen und wieder ausgeben. Hat eigentlich soweit getan, hatte nur das Problemm, dass es immer mehr Zeichen ausgegeben wurden als eingetippt. Ich denke mal, es liegt an dem Buffer von dem getc() Befehl. Kann man diesen Buffer irgendiwe umgehen?
Beim GPS-String beginnt die erste Zeile immer mit einem '$' Zechen.
Code:
   
   char buffer[120];
   char abbruch='$';
   int z=0,zeichenzaehler=0,x=0,y=0;
   void main()
{

   setup_adc_ports(AN0_TO_AN1|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   #use delay(clock=20000000)
   #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=pc)
   #use rs232(baud=4800,parity=N,xmit=PIN_D0,rcv=PIN_D1,bits=8,stream=gps)

 fprintf(pc,"Ready\n");
   delay_ms(1000);
do{
   
 
   for (z=0; z<120 && x<2; z++)
   {
   buffer[z] = getc(gps);
      if(buffer[z]== abbruch)
         {
         z=0;
         x=x+1;
         }
   zeichenzaehler++;
   }
   buffer[0]='$';
   //zeichenzaehler=zeichenzaehler/3;
   for (z=0; z<zeichenzaehler; z++)
   {
   fprintf(pc,"%c",buffer[z]);
   }
   zeichenzaehler=0;
   x=0;

   }
   while(true);


}
Gespeichert
Coltfisch
Sr. Member
****
Offline Offline

Beiträge: 496



Profil anzeigen WWW
« Antworten #1 am: April 15, 2008, 10:56:33 »

kannst Du bitte etwas genauer beschreiben, wie die Daten der GPS-Maus aussehen?
Am besten direkt einen Dump der Daten in HyperTerm hier reinposten.
Kommen die Daten im Format $Daten$Daten$Daten$usw... herein oder ist nach jedem Datensatz ein Zeilenumbruch enthalten:

$Daten
$Daten
$Daten
$Daten
.
.
.

Letzteres würde die Auswertung deutlich vereinfachen. Außerdem wäre interessant, mit welchem Abstand die einzelnen Daten hereinkommen.

Gruß
daniel
Gespeichert
maksim
Newbie
*
Offline Offline

Beiträge: 9


Profil anzeigen
« Antworten #2 am: April 15, 2008, 11:28:46 »

So sehen die Daten im Hyperterminal aus.

$GPGGA,184125.404,4856.9694,N,00908.9820,E,0,00,,230.9,M,48.0,M,,0000*73
$GPRMC,184125.404,V,4856.9694,N,00908.9820,E,,,080408,,,N*76
$GPVTG,,T,,M,,N,,K,N*2C
$GPGGA,184126.400,4856.9694,N,00908.9820,E,0,00,,230.9,M,48.0,M,,0000*74
$GPRMC,184126.400,V,4856.9694,N,00908.9820,E,,,080408,,,N*71
$GPVTG,,T,,M,,N,,K,N*2C
$GPGGA,184127.404,4856.9694,N,00908.9820,E,0,00,,230.9,M,48.0,M,,0000*71
$GPRMC,184127.404,V,4856.9694,N,00908.9820,E,,,080408,,,N*74
$GPVTG,,T,,M,,N,,K,N*2C
$GPGGA,184128.404,4856.9694,N,00908.9820,E,
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,3,1,12,28,70,000,38,26,69,000,41,15,54,000,,08,42,000,*7B
$GPGSV,3,2,12,10,24,000,,27,16,000,,18,13,000,,17,12,000,*70
$GPGSV,3,3,12,19,08,000,,07,04,000,,09,03,000,,21,00,000,*70
$GPRMC,184128.404,V,4856.9694,N,00908.9820,E,,,080408,,,N*7B
$GPVTG,,T,,M,,N,,K,N*2C
$GPGGA,184129.404,4856.9694,N,00908.9820,E,0,00,,230.9,M,48.0,M,,0000*7F
$GPRMC,184129.404,V,4856.9694,N,00908.9820,E,,,080408,,,N*7A
$GPVTG,,T,,M,,N,,K,N*2C
$GPGGA,184130.404,4856.9694,N,00908.9820,E,0,00,,230.9,M,4
$GPGGA,184130.404,4856.9694,N,00908.9820,E,0,00,,230.9,M,4
Gespeichert
Coltfisch
Sr. Member
****
Offline Offline

Beiträge: 496



Profil anzeigen WWW
« Antworten #3 am: April 15, 2008, 12:36:15 »

Versuch das mal:

Code: (c)
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=pc)
#use rs232(baud=4800,parity=N,xmit=PIN_D0,rcv=PIN_D1,bits=8,stream=gps)

// jeder vom GPS gesendete String wird mit einem Zeilenumbruch abgeschlossen
#define ABBRUCH '\n'


// warten, bis ein vollständiger String empfangen wurde. Dieser wird
// anschließend in "buf" zurückgegeben. Die Länge des Strings wird als
// Returnwert zurückgegeben
int8 poll_string(char *buf)
{
    int8 z = 0;
    int1 done = false;
    do
    {
        // Zeichen empfangen?
        if(kbhit(gps))
        {
            buf[z] = getc(gps);
            // Zeilenumbruch gefunden?
            if(buf[z] == ABBRUCH)
            {
                // String fertig empfangen
                done = true;
            }
            z++;
            // Buffer voll?
            if(z == 119) done = true;
        }
    }while(!done);
    // String zur Sicherheit 0-terminieren
    buf[z] = '\0';
    // Länge der Zeichenkette zurückgeben
    return z;
}



char buffer[120];
int len = 0;
void main()
{
   setup_adc_ports(AN0_TO_AN1|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   fprintf(pc,"Ready\n");
   delay_ms(1000);

   do
   {
       // Zeichenkette einlesen
       len = poll_string(buffer);
       // Zeichenkette an PC senden
       fprintf(pc,buffer);
   }
   while(true);
}

Kann es hier leider gerade nicht kompilieren, können also noch Fehler drin sein.

Viel Erfolg,
daniel
« Letzte Änderung: April 15, 2008, 21:27:50 von Coltfisch » Gespeichert
maksim
Newbie
*
Offline Offline

Beiträge: 9


Profil anzeigen
« Antworten #4 am: April 15, 2008, 19:55:14 »

Danke für den Code,

hab das mal ausprobiert. Funktioniert leider immer noch nicht. Bekomme am Display nur Ready angezeigt, sonst nichts. Ich muss aber auch sagen, dass ich Probleme manche Zeilen zu verstehen, wie z.b diese Zeile " int8 poll_string(char *buf)" und mit der letzten DO-Schleife komme ich auch nicht weiter. Ist es nicht so, dass er aus der Schleife nie rauskommt???

Gruß
Max
Gespeichert
Coltfisch
Sr. Member
****
Offline Offline

Beiträge: 496



Profil anzeigen WWW
« Antworten #5 am: April 15, 2008, 21:33:30 »

Hab noch ein paar Fehler entdeckt. Habe den obigen Code direkt korrigiert. Versuch es bitte damit nochmal!

Hier die Änderungen:
In der Zeile
Code: (c)
if(kbhit())
fehlte natürlich der stream, sonst wird der Compiler vermutlich den default-stream einsetzen, was in diesem Fall der Stream 'pc' sein wird.
Außerdem hatte ich den Zeiger char *buf zwar als Parameter vorgesehen, innerhalb der Funktion aber auf die globale Variable 'buffer' zugegriffen, was der Compiler vermutlich bemängelt hat.

Ist mit der Funktion poll_string(...) jetzt noch etwas unklar?

Mit der letzten do-while-Schleife verhält es sich tatsächlich so, dass sie aktuell nie verlassen wird. Dies war aber auch bei Deiner Version des Codes bereits so.
Das Programm wird also in einer Endlosschleife die Strings vom GPS empfangen und an den PC weiterleiten.

Gruß,
daniel
Gespeichert
maksim
Newbie
*
Offline Offline

Beiträge: 9


Profil anzeigen
« Antworten #6 am: April 18, 2008, 08:27:19 »

Morgen,

hab gestern das Ganze mal ausprobiert und nach kurzer Fehlersuche funktioniert es!!!!! Hatte die GPS-Maus an PORTB hängen und nicht wie im Programm festgelegt an PORTD.
Hab jetzt noch eine Kleinigkeit im Programm geändert, da er teilweise nur halben String vom GPS Signal ausgegeben hat.


Code:
        do
        {
        if(kbhit(gps))
        {
            buf[z] = getc(gps);
            // Zeilenumbruch gefunden?
            if(buf[z] == ABBRUCH)
            {
                //erster Zeilenumbruch gefunden,
                if (umbruch == 0) z=0;
                umbruch++;
            }
            z++;           
            // Buffer voll oder ganzen String empfangen ??
            if(z == 119 || umbruch == 2) done = true;
        }
        }while(!done);

Hab jetzt nur noch ein Problem, dass er bei der Ausgabe, am Anfang jeder Zeile zufällige Zeichen anzeigt, z.B.
&$GPRMC,184125.404,V,4856.9694,N,00908.9820,E,,,080408,,,N*76
b$GPRMC,184125.404,V,4856.9694,N,00908.9820,E,,,080408,,,N*76
@$GPRMC,184125.404,V,4856.9694,N,00908.9820,E,,,080408,,,N*76

Werde versuchen heute mal das Problem zu lösen.
Danke für eure Hilfe.

Gruß Max
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.035 Sekunden mit 19 Zugriffen.
 
Top! Top!