Hallo,
ich empfange NMEA Daten von einem GPS-Modul und parse diese.
Gleichzeitig werden die NMEA Daten wieder an die UART ausgegeben.
Meine Lösung sieht so aus:
1 | #define UART0_TX_BUFFER_SIZE 0x60
|
2 | #define UART0_RX_BUFFER_SIZE 0x60
|
3 | #define UART1_TX_BUFFER_SIZE 0x10
|
4 | #define UART1_RX_BUFFER_SIZE 0x10
|
5 |
|
6 | uartSetRxHandler(0, gpsRxHandler);//Handler der RX Daten
|
7 |
|
8 |
|
9 | void gpsRxHandler(u08 charIn)
|
10 | {
|
11 | static u08 j=0,startflag=0;
|
12 |
|
13 | if (systemState & SYSTEM_NMEA_OUTPUT)
|
14 | {
|
15 | uartAddToTxBuffer(0, charIn);
|
16 | txCharCounter++;
|
17 | }
|
18 | if ((varioState & SYSTEM_NMEA_PARSER) == 0)
|
19 | {
|
20 | startflag = 0;
|
21 | j = 0;
|
22 | }
|
23 | else
|
24 | {
|
25 | if (startflag)
|
26 | {
|
27 | if (( charIn != '\r') && ( charIn != '\n') && (j < NMEA_BUFFERSIZE))
|
28 | {
|
29 | NmeaSentence[j++] = charIn; //Fill String
|
30 | }
|
31 | else
|
32 | {
|
33 | NmeaSentence[j] = 0; //String complete
|
34 | j = 0;
|
35 | startflag = 0;
|
36 | if (!strncmp(NmeaSentence, "GPGGA", 5))
|
37 | {
|
38 | nmeaProcessGPGGA(NmeaSentence);
|
39 | }
|
40 |
|
41 | else
|
42 | {
|
43 | if (!strncmp(NmeaSentence, "GPGSA", 5))
|
44 | {
|
45 | nmeaProcessGPGSA(NmeaSentence);
|
46 | }
|
47 | else
|
48 | {
|
49 | if (!strncmp(NmeaSentence, "GPRMC", 5))
|
50 | {
|
51 | nmeaProcessGPRMC(NmeaSentence);
|
52 | nmeaCalculations();
|
53 | state_bits |= GPS_RDY;
|
54 | }
|
55 | }
|
56 |
|
57 | }
|
58 | }
|
59 | }
|
60 | if (charIn == '$')
|
61 | {
|
62 | startflag = 1;
|
63 | }
|
64 | }
|
65 | }
|
66 |
|
67 | in der main loop:
|
68 |
|
69 | if (txCharCounter > 70)
|
70 | {
|
71 | uartSendTxBuffer(0);
|
72 | txCharCounter = 0;
|
73 | }
|
zu 98% läuft der code wie gewünscht, aber manchmal verhaspelt sich die
Ausgabe der NMEA Daten.