Forum: Compiler & IDEs error: expected identifier or '(' before '}' token


von Andreas Herrmann (Gast)


Lesenswert?

Hallo, ich habe mit der Software für meine Studienarbeit irgendwie 
größere Probleme. Ich komme nicht dahinter, was die folgende 
Fehlermeldung von mir will:
../gps_studienarbeit_software.c:141: error: expected identifier or '(' 
before '}' token

Es wäre super, wenn mir da jemand weiterhelfen könnte.
Vielen Dank im Voraus.
Nachfolgend der Quelltext:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>

#include "mydefs.h"
#include "PROTOS.h"
#include "serial.h"
#include "lcd.h"


//"volatile" für alle Variablen die in Interrupt's geändert werden
unsigned int volatile overflow;

char line[80];     //Zeichenpuffer

unsigned char satcount;
unsigned char gsvcount;

//###################################################################### 
#############
SIGNAL(SIG_OVERFLOW1)        /* signal handler for tcnt1 overflow 
interrupt */
//###################################################################### 
#############
{
 if(overflow>0) overflow--;
}

//###################################################################### 
#############
/* Hauptprogramm */
int main(void)
//###################################################################### 
#############
{
 unsigned char c;

 DDRA=0xFF;    // set io-pins on PortA
 PORTA=0;     //LCD-Datenbus

 DDRD=0xC0;    // set io-pins on PortD
 PORTD=0x00;   //LED's

 SFIOR&=!(1<<PUD);   //Pullups Enable
// SFIOR=0;     //Pullups Enable

 LCDInit();
 ser_init();

//Timer1
 TCCR1A=0;
 TCCR1B=0x01;        //Timer1 Start Takt = F/1
 TIMSK=(1<<TOIE1);   /* enable timer1 overflow int */
 sei();              //enable interrupts

 LCDCls();
 LCDWrite("GPS-Display");
 LCDPos(2,1);
 LCDWrite("Andreas Herrmann");
 Delay1ms(1000);
 LCDCls();

 overflow=TIME_OUT;


   ser_puts("$PRWIILOG,???,V,,,\n"); //Alle Messages abschalten
   Delay1ms(100);
   ser_puts("$PRWIILOG,GGA,A,T,1,0\n"); //GGA Message ein. Jede Sekunde
   Delay1ms(100);
   ser_puts("$PRWIILOG,RMC,A,T,1,0\n"); //RMC Message ein. Jede Sekunde
   Delay1ms(100);
//   ser_puts("$PRWIILOG,GSA,A,T,1,0\n"); //GSA Message ein. Jede 
Sekunde
//   Delay1ms(100);
   ser_puts("$PRWIILOG,GSV,A,T,1,0\n"); //GSV Message ein. Jede Sekunde
   Delay1ms(100);
//#endif

//#ifdef SIRF
//Checksumme am Ende erforderlich !
   //GPS könnte noch auf 9600 Baud stehen.
/*   UBRRL=UART_BAUD_SELECT_9600; //Auf höhere Baudrate schalten
   Delay1ms(100);
   ser_puts("$PSRF100,1,4800,8,1,0*0E\n"); //Neue Baudrate zum GPS 
senden
   Delay1ms(100);
   UBRRL=UART_BAUD_SELECT_4800; //und zurückschalten
  Delay1ms(100);
*/
//   ser_puts("$PSRF103,01,00,00,01*25\n"); //GLL Message abschalten
//   ser_puts("$PSRF103,02,00,00,01*26\n"); //GSA Message abschalten
//   ser_puts("$PSRF103,03,00,00,01*27\n"); //GSV Message abschalten
//   ser_puts("$PSRF103,04,00,00,01*20\n"); //RMC Message abschalten
//   ser_puts("$PSRF103,05,00,00,01*21\n"); //VTG Message abschalten

   ser_puts("$PSRF103,00,00,01,01*25\n"); //GGA Message 1s einschalten
   Delay1ms(100);
   ser_puts("$PSRF103,04,00,01,01*21\n"); //RMC Message 1s einschalten
   Delay1ms(100);
   ser_puts("$PSRF103,03,00,01,01*26\n"); //GSV Message 1s einschalten
   Delay1ms(100);
//#endif

 for(;;) // Anfang Programm Endlosschleife
  {
   do { c=ser_getc(); }while(c!='$'); //Warte auf Anfang einer Message 
z.B. "$GPGGA"

   GetLine(','); //Hole den Header

   if(strcmp(line,"GPGGA")==0) GP_GGA();
   if(strcmp(line,"GPRMC")==0) GP_RMC();
   if(strcmp(line,"GPGSA")==0) GP_GSA();
   if(strcmp(line,"GPGSV")==0) GP_GSV();
   if(strcmp(line,"GPVTG")==0) GP_VTG();

  } // Ende Programm Endlosschleife
}


void Delay1ms(unsigned int time)

{
 unsigned int i;

 for(i=0; i<time; i++) Delay100us(10);
}


void Delay100us(unsigned char time) {


 unsigned char k,l;


 for(k=0; k<time; k++)
  {
   for(l=0; l<40; l++)
    {
     //Ein CPU-Clock = 0.125us bei 8MHz
     NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); 
NOP();
     NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); 
NOP();
    }
  }
  }
  }

von Hmm... (Gast)


Lesenswert?

Wo hast du denn die Funktion/Makro NOP definiert?

Achja, dir ist bewusst das die Schleifen in Delay100us u.U. vom Compiler 
wegoptimiert werden? Und selbst wenn nicht benötigen die Schleifen 
selbst einige Rechenzeit (Variable inkrementieren, Vergleichen, etc) 
wodurch du um einiges länger als 100µs warten würdest.

Schau dir mal hier auf der Seite das Tutorial zum Timer an, da wird 
beschrieben wie man so etwas mit einem Hardwaretimer erledigt.

Wenn ich mich recht entsinne, sollte übrigens der GCC bereits 
Delay-Funktionen bereit stellen.

von Bernhard M. (boregard)


Lesenswert?

Wenn Du Deinen source besser formatierst siehts Du auch
1
void Delay100us(unsigned char time)
2
{
3
    unsigned char k,l;
4
5
6
    for(k=0; k<time; k++)
7
    {
8
        for(l=0; l<40; l++)
9
        {
10
            //Ein CPU-Clock = 0.125us bei 8MHz
11
            NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();
12
            NOP();
13
            NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();
14
            NOP();
15
        }
16
    }
17
}
18
}
da ist eine Klammer zuviel...

von Johannes M. (johnny-m)


Lesenswert?

Erstens wäre es sinnvoll, auch im Code zu kennzeichnen, welche Zeile den 
Fehler verursacht. Außerdem verwende bitte die 
Code-Formatierungsfunktion des Forums oder poste den Code als Anhang! 
Und mach vernünftige Einrückungen. Das da oben ist eine mittlere 
Katastrophe. Wenn ein Student mir mit sowas käme, würde ich ihn sofort 
wieder wegschicken und mir das erst ansehen, wenn es vernünftig 
formatiert ist.

Und noch was: SIGNAL und die signal.h sind veraltet. Falls Du es noch 
nicht getan hast, lade eine aktuelle Version runter. Und schau in der 
libc-Doku nach, wie es richtig geht. Auch das AVR-GCC-Tutorial gibt 
darüber Auskunft.

von Klaus F. (kfalser)


Lesenswert?

Es heißt, dass du die eine } zuviel hast, oder jedenfalls die Klammern 
nicht zusammenpassen.
Besorge Dir einen anständigen Editor, formattieren den Code so, dass man 
immer { und } erkennt.
Das wirst Du in Zukunft öfter brauchen (außer du gehst in das 
Management).

von Johannes M. (johnny-m)


Lesenswert?

Klaus Falser wrote:
> Das wirst Du in Zukunft öfter brauchen (außer du gehst in das
> Management).
Der war gut...

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Johannes M. wrote:

> Und mach vernünftige Einrückungen. Das da oben ist eine mittlere
> Katastrophe. Wenn ein Student mir mit sowas käme, würde ich ihn sofort
> wieder wegschicken und mir das erst ansehen, wenn es vernünftig
> formatiert ist.

Japs, sehe ich auch so. Ich wuerde mir echt gut ueberlegen, was ich da 
abgebe. Schlampiger kann es ja nicht mehr aussehen. Und diese 
NOP()-Kette da ist auch grausam. Fuer den AVR (scheint ja einer zu sein) 
gibt es delay-Funktionen, die nachgewiesenerweise auch funktionieren, 
also warum verwendest Du sie nicht?

1
  #define F_CPU 8000000UL
2
  #include <util/delay.h>
3
4
  //...
5
6
  _delay_ms(100);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.