Serielle Schnittstelle calculator

OP #3457240
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:
************************************************************************ 
*******/
#3457289
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.
OP #3457300
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
}
Gast #3457932
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)
OP #3458137
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
}
#3458351
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.

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