- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: C macht mich wahnsinnig

  1. #11
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Anzeige

    Praxistest und DIY Projekte
    Wenn jetzt das Stop-Zeichen kommt setzt du immer das nächste Zeichen auf 0, richtig? Aber dann kann ich ja schlecht ne 0 empfangen ohne, dass die Position gleich als Ende angesehen wird. Ist doch ungüstig oder?

    mfg
    jagdfalke

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    schaut euch mal das hier an:
    Code:
    char inStr[500];
    int inCnt = 0;
    char stopsign = 'a';
    char startsign = 'b';
    
    SIGNAL(SIG_USART_RECV) {
    	inStr[inCnt] = uart_readChar();
    
    	switch (inStr[inCnt])
    	{
    	case stopsign:
    		printf("STOPBIT EMPFANGEN: %s\n\r", inStr);
    		inCnt=0;
    		break;
    	case startsign:
    		printf("RESTART");
    		inCnt=0;
    		break;
    	default:
    		inCnt++;
    		break;
    	}
    }
    Die Fehlermeldung hier lautet:
    test.c: In function '__vector_13':
    test.c:53: error: case label does not reduce to an integer constant
    test.c:57: error: case label does not reduce to an integer constant
    make: *** [test.o] Fehler 1
    Was bedeutet das? "does not reduce to an integer constant" ???

    mfg
    jagdfalke

  3. #13
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.04.2005
    Ort
    Hamburg <-> Bremen
    Alter
    44
    Beiträge
    112
    Hi,

    kannst keine Variable fuer einen Fall verwenden (wert koennte isch dann ja aendern). Nimm einfach ein Define.

    Code:
    #define stopsign  'a'
    #define startsign  'b'

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Danke, kann man dann auch den Inhalt des Arrays löschen? Damit bei der Ausgaben nicht immer der Datenmüll vom letzten Empfang angezeigt wird?

  5. #15
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Wenn du nach dem Stopsign den InIdx NICHT löscht, zeigt er
    1 die Länge der Daten an. Nach dem AUSWERTEN setzt du erst auf NULL.
    2 isser null, gilt der input als leer, also auch nix zum herzeigen.
    Aber bei sowas kommt es jetzt schon sehr auf das Umfeld an, genauso wie mit dem \0 am Schluss. der hat nur einen Sinn bei String-input.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #16
    wenn ich mich nicht ganz irre kannst du wenn du das stop zeichen erhalten hast einfach ein '\0' eintragen wenn ich mich nicht ganz irre ist das das ende signal für ein string.(zumindest beim PC).

    Paladin

    also sollte der code in etwas so aussehen

    Code:
    #define stopsign  'a'
    #define startsign  'b' 
    
    char inStr[500];  //könnte ein bischen gross sein
    int inCnt = 0;
    
    SIGNAL(SIG_USART_RECV) {
       inStr[inCnt] = uart_readChar();
    
       switch (inStr[inCnt])
       {
       case stopsign:
          inStr[inCnt]='\0';
          printf("STOPBIT EMPFANGEN: %s\n\r", inStr);
          inCnt=0;
          break;
       case startsign:
          printf("RESTART");
          inCnt=0;
          break;
       default:
          inCnt++;
          break;
       }
    }

    dadurch wird aber die ISR eigentlich ziehmlich lang weil print lange dauern kann besser währe es wenn du auf ein start signal wartest und dann in einen buffer schreibst und wenn du ds stop bit erhälts dann soll ein stringready flag gesetzt werden was dann im hauptrogramm abgerufen wird.

    Code:
    
    #define stopsign  'a'
    #define startsign  'b' 
    
    char inStr[500];  //könnte ein bischen gross sein
    int inCnt = 0;
    flag_string_da=0;
    flag_string_lesen=0;
    
    SIGNAL(SIG_USART_RECV) {
      unsigned char tmp=UDR; //auslesen der gesendeten daten
      
      if (tmp == startbit)
           flag_string_lesen=1;
      else if (tmp == startbit){
        inStr[count] = '\0';// ende des strings
        flag_string_lesen=0;
        flag_string_da=1;
               // hier kann auch eine eventuelle rücksetztung des count stattfinden je nach auswertung
      }
      if ( flag_string_lesen==1){
         inStr[count++] = tmp;    
      }
    
    }
    
    in der main muss jetzt nur noch flag_string_da im MAIN ausgewertet werden.

    Der code ist nicht getestet aber das prinzip sollte funktionieren ohne dabei alle interrupts oder den controller zu blockieren.

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test