Forum: Mikrocontroller und Digitale Elektronik Serielle Schnittstelle calculator


von Serieousl L. (stephan2013)


Lesenswert?

•  Einlesen d. 1. Operanten(scanf)   // 57
•  Einlesen d Operator(USART Getchar)  +
•  Einlesen d. 2. Operanten(scanf)    // 277
•  Einlesen d Operator(Getchar)    =
Berechnen und Ausgeben der Ergebnisse in d. Form 57+277= ….

Also im Prinzip ein Taschenrechner
Ich weiß nicht was hier falsch ist :/

#include <avr/io.h>
#include "Wait.h"
#include "USART.h"
1
int main(void)
2
{  int opnd1, opnd2;
3
  uint8_t oprt1, oprt2;
4
  uint8_t operator1, operator2;
5
  uint8_t erg;
6
  USARTInit(0,9600,1,0,1,0);
7
8
  scanf("%d", &opnd1);
9
    operator1 = USARTGetChar(scanf("%d", &oprt1));
10
    // oprt1= USARTReceive(0);
11
    scanf("%d", &opnd2);
12
    //oprt2= USARTReceive(0);
13
    operator2 = USARTGetChar(scanf("%d", &oprt2));
14
    while(1)
15
    {
16
    
17
    }
18
  switch (operator1)
19
    {
20
    case '*' : erg= oprt1*oprt2; break;
21
    case '+' : erg= oprt1+oprt2; break;
22
    case '-' : erg= oprt1-oprt2; break;
23
    case '/' : erg= oprt1/oprt2; break;
24
    }
25
      
26
  printf("%d %s %d %s %d", opnd1, operator1, opnd2, operator2, erg);
27
}

Getchar:
************************************************************************ 
*******/

von Roland .. (rowland)


Lesenswert?

hisham moustafa schrieb:
> while(1)
>     {
>
>     }
>   switch (operator1)
>     {
>     case '*' : erg= oprt1*oprt2; break;
>     case '+' : erg= oprt1+oprt2; break;
>     case '-' : erg= oprt1-oprt2; break;
>     case '/' : erg= oprt1/oprt2; break;
>     }

Die Switchverzweigung wird nie erreicht, weil das Programm vorher schon 
in der Enlosschleife hängt.

Die while(1)-Schleife muss über den ganzen Code fassen, damit die 
Ein-Ausgabe zyxklisch widerholt wird.

von Serieousl L. (stephan2013)


Lesenswert?

Roland ... schrieb:
> hisham moustafa schrieb:
>> while(1)
>>     {
>>
>>     }
>>   switch (operator1)
>>     {
>>     case '*' : erg= oprt1*oprt2; break;
>>     case '+' : erg= oprt1+oprt2; break;
>>     case '-' : erg= oprt1-oprt2; break;
>>     case '/' : erg= oprt1/oprt2; break;
>>     }
>
> Die Switchverzweigung wird nie erreicht, weil das Programm vorher schon
> in der Enlosschleife hängt.
>
> Die while(1)-Schleife muss über den ganzen Code fassen, damit die
> Ein-Ausgabe zyxklisch widerholt wird.
1
int main(void)
2
{  int opnd1, opnd2;
3
  uint8_t oprt1, oprt2;
4
  uint8_t operator1, operator2;
5
  uint8_t erg;
6
  USARTInit(0,9600,1,0,1,0);
7
8
  
9
    while(1)
10
    {
11
    scanf("%d", &opnd1);
12
    operator1 = USARTGetChar(scanf("%d", &oprt1));
13
    // oprt1= USARTReceive(0);
14
    scanf("%d", &opnd2);
15
    //oprt2= USARTReceive(0);
16
    operator2 = USARTGetChar(scanf("%d", &oprt2));
17
    
18
    switch (operator1)
19
    {
20
    case '*' : erg= oprt1*oprt2; break;
21
    case '+' : erg= oprt1+oprt2; break;
22
    case '-' : erg= oprt1-oprt2; break;
23
    case '/' : erg= oprt1/oprt2; break;
24
    }
25
      
26
  printf("%d %s %d %s %d", opnd1, operator1, opnd2, operator2, erg);
27
    }
28
29
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

hisham moustafa schrieb:
> operator1 = USARTGetChar(scanf("%d", &oprt1));

Ich glaube nicht, daß USARTGetChar etwas mit dem Rückgabewert von 
scanf anfangen kann.

von Serieousl L. (stephan2013)


Lesenswert?

Oke..
Was macht USARTGetChar genau dann ?
oder welchen Übergabeparameter muss ich hineinschreiben ?

von DirkB (Gast)


Lesenswert?

Du solltest dich erstmal mit scanf und printf auseinander setzen.
Das sind zwei unterschiedliche Funktionen,.
Was sie jedoch gemeinsam haben ist, dass die variablen Parameter zum 
Formatstring passen müssen.

Beispiele:
%d bei scanf dient zum Einlesen von einem dezimalen int. (das ist i.A 
kein uint8_t)
%s bei printf dient zur Ausgabe von einer nullterminierten Zeichenkette 
und erwartet einen Zeiger darauf.

Du darfst aber nicht von dem Verhalten von printf auf das Verhalten von 
scanf schließen (und umgekehrt)

von Floh (Gast)


Lesenswert?

hisham moustafa schrieb:
> Form 57+277= ….
> uint8_t operator1, operator2;
>   uint8_t erg;

277 passt nicht in einen uint8_t, das Ergebnis der Addition noch 
weniger.
:-)

von Serieousl L. (stephan2013)


Lesenswert?

Floh schrieb:
>> uint8_t operator1, operator2;

operator ist nicht die Zahl, sondern (+,-,*,/)

von Serieousl L. (stephan2013)


Lesenswert?

jetzt habe ich das geändert wie Sie es gesagt haben aber:
beim Terminal wenn die Zahlen schreibe schreibt er nach einem 
Operator(zB: +) nichts :(
1
int main(void)
2
{  int opnd1, opnd2;
3
  uint8_t oprt1, oprt2;
4
  char operator1, operator2;
5
  uint8_t erg;
6
  USARTInit(0,9600,1,0,1,0);
7
8
  
9
    while(1)
10
    {
11
    scanf("%d", &opnd1);
12
    operator1 = USARTReceive(0);
13
    scanf("%d", &opnd2);
14
    operator2 = USARTReceive(0);
15
    switch (operator1)
16
    {
17
    case '*' : erg= oprt1*oprt2; break;
18
    case '+' : erg= oprt1+oprt2; break;
19
    case '-' : erg= oprt1-oprt2; break;
20
    case '/' : erg= oprt1/oprt2; break;
21
    }
22
  printf("%d %c %d %c %d", opnd1, operator1, opnd2, operator2, erg);
23
    }
24
25
}

von Dirk B. (dirkb2)


Lesenswert?

Was wird denn wie eingegeben?
scanf lässt alles, was nicxht zur Zahl passt im Eingabestrom stehen.
Das ist auch das Leerzeichen oder das '\n' von der Returntaste.
Wozu überhaupt das USARTReceive ?
1
scanf("%d %c %d %c", &opnd1, &operator1, &opnd2, &operator2);
Wobei die Leerzeichen auch eine Bedeutung haben.
Wofür ist operator2 ?

Und erg sollte doch auch vom Typ der Operanden sein.

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.