error: expected identifier or '(' before '}' token

Gast #1080897
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();
    }
  }
  }
  }
Gast
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.
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...
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.
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).
Persönliche Seite
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);

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.