char und int_8t nicht das selbe?

#4004146
Lesenswert?

Hallo

ich dachte immer char und int_8t wäre das selbe.
Dieses C Programm zeigt mir gerade, dass es wohl nicht so ist^^

Ich habe ein Programm welches über die Serie Schnittstelle Daten an 
meinen Controller sendet. Allerdings scheint dieses Programm Probleme 
mit Sonderzeichen zu haben.
Statt ü sendet es die Zahl 195 anschließend 188.
Statt ü sendet es die Zahl 195 anschließend 159.

Das unten stehende Programm funktioniert so. Es passt diesen Fehler 
entsprechend an.

Schreibe ich allerdings statt
char empfangen =0;
das hier
int_8t empfangen =0;
funktioniert meine Auswertung nicht mehr.
Die Zeichen 195 und 188 bzw 159 werden aber trotzdem in mein Array
empfangspuffer übertragen.

Wie kann das sein?
1
ISR(USARTC1_RXC_vect)
2
{  
3
  char empfangen =0;
4
  empfangen = USARTC1.DATA;
5
  
6
  if (paket_wird_empfangen ==1)
7
  {
8
    if (empfangen == '$') //36Wenn das Schlusszeichen $ empfangen wurde
9
    {
10
      paket_empfangen =1;
11
      paket_wird_empfangen =0;
12
    }
13
    else
14
    {
15
      if(empfangen!= 195) //Anfangszeichen für Sonderzeichen nicht werten
16
      {
17
        //Sonderzeichen anpassen
18
        if(empfangen ==188) empfangen ='ü';
19
        if(empfangen ==159) empfangen ='ß';
20
        
21
        empfangspuffer[empfangspuffer_zaehler] = empfangen; 
22
        empfangspuffer_zaehler++;
23
      }
24
      
25
    }
26
  }
27
  
28
  if (empfangen == '#')  //35 =#
29
  {
30
    paket_wird_empfangen =1;
31
  }
32
  
33
}
#4004192
Lesenswert?

Kann dein Compiler keine Warnungen? Bei mir kommt:
1
main.c:46:40: error: character too large for enclosing character literal type
2
        if(empfangen ==188) empfangen ='ü';
3
                                       ^
4
main.c:47:40: error: character too large for enclosing character literal type
5
        if(empfangen ==159) empfangen ='ß';
6
                                       ^
7
main.c:43:17: warning: comparison of constant 195 with expression of type 'char' is always true
8
      [-Wtautological-constant-out-of-range-compare]
9
    if(empfangen!= 195) //Anfangszeichen für Sonderzeichen nicht werten
10
       ~~~~~~~~~^  ~~~
11
main.c:46:22: warning: comparison of constant 188 with expression of type 'char' is always false
12
      [-Wtautological-constant-out-of-range-compare]
13
        if(empfangen ==188) empfangen ='ü';
14
           ~~~~~~~~~ ^ ~~~
15
main.c:47:22: warning: comparison of constant 159 with expression of type 'char' is always false
16
      [-Wtautological-constant-out-of-range-compare]
17
        if(empfangen ==159) empfangen ='ß';

Warnungen sind nicht zum Spaß da.
#4004208
Lesenswert?

Matthias Frank schrieb:
> ich dachte immer char und int_8t wäre das selbe.

Kann so sein, muß aber nicht.

Ein Ärgernis (IMHO) bei C ist, daß die Standard-Datentypen so schwammig 
definiert sind:

char - kann ein Zeichen halten
int - Ganzzahl-Typ mit (ca.) der Bitbreite der CPU

Weil man für viele Anwendungen aber Typen mit genau bekannter Bitbreite 
und signedness (ist bei char z.B. unbestimmt) braucht, hat man mit C99 
das System-Headerfile stdint.h [1] eingeführt, das Integertypen mit 
vorhersagbarer Bitbreite und Signedness definiert.

[1] https://en.wikibooks.org/wiki/C_Programming/C_Reference/stdint.h
(Firma: Brainit GmbH) #4004213
Lesenswert?

Fritz Ganter schrieb:
> Schreibe -Wtype-limits in deine Compiler-Flags rein, dann bekommst du
> deswegen eine Warnung. Ist anscheinend nicht in -Wall enthalten.

Korrekt, -Wall aktiviert das nicht, aber -Wextra. Bei mir sind 
grundsätzlich immer beide aktiv, Code der Warnungen wirft wird nicht 
committed, sprich Warnungen werden immer alle bereinigt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren