Forum: Mikrocontroller und Digitale Elektronik UART ewiges senden?


von HulaHup (Gast)


Lesenswert?

Hallo

habe da eine Frage. Würde ich in so einem Fall ständig was gesendet 
bekommen?

Die Idee war eigentlich, bei einem Fehler (Flag) am HyperTerminal das 
entsprechende Zeichen (0,1,2) angezeigt zu werden. Allerdings soll es 
nur einmal angezeigt werden. Aber ich so wie es jetzt ist befürchte ich 
dass die ganze zeit die zeichen gesendet werden. :(

Ich könnte es auch in die if-Anweisung reinstecken, aber der Fehler kann 
auch ausserhalb der if- anweisung auftreten.

Wie macht ihr es, dass nur einmal was gesendet wird?

Gruss´

1
int main(void) 
2
{
3
  initmain();
4
  inituart();
5
  sei();
6
  
7
  DDRD |= 0x05;
8
  
9
  while(1) 
10
  {    
11
    
12
    switch(Flag)
13
    {
14
      case 0:  TransmitChar(0x00);break; 
15
      case 1:  TransmitChar(0x01);break; 
16
      case 2:  TransmitChar(0x02);break; 
17
    }
18
    
19
    if(Address == ID )
20
    {
21
      Process();
22
      Index = 0;
23
      count=0;
24
    }
25
    else ;
26
  }
27
28
return 0;
29
}

von HulaHup (Gast)


Lesenswert?

..fürs bessere verständnis, was ich meine.

HyperTerminal: sollzustand
_______________________
 1




_______________________


HyperTerminal: istzustand?
_______________________
 11111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111
usw.....


_______________________

von Karl H. (kbuchegg)


Lesenswert?

HulaHup schrieb:

> Wie macht ihr es, dass nur einmal was gesendet wird?

Indem es auch einen 'Fehlerzustand' 'Kein Fehler' gibt. Tritt ein Fehler 
auf, wird der entsprechende Fehlerzustand gesetzt. Die Senderoutine 
sendet den Fehler und danach wird der Fehler wieder auf 'kein Fehler' 
gesetzt.
1
   ....
2
3
  Flag = 0xFF;   // es gibt keinen Fehler
4
5
  while(1) 
6
  {    
7
    
8
    switch(Flag)
9
    {
10
      case 0:  TransmitChar('0');break; 
11
      case 1:  TransmitChar('1');break; 
12
      case 2:  TransmitChar('2');break;
13
    }
14
    Flag = 0xFF;   // für kein Fehler
15
16
    ....

du solltest übrigens lieber ein paar #define anstelle dieser Konstanten 
im Code benutzen. Das macht das ganze wesentlich lesbarer
1
#define OVERFLOW_ERROR   0x01
2
#define FRAMING_ERROR    0x02
3
...
4
#define NO_ERROR         0xFF
5
6
...
7
8
  Flag = NO_ERROR;
9
10
  while(1) 
11
  {    
12
    
13
    if( Flag != NO_ERROR )
14
    {
15
      switch(Flag)
16
      {
17
        case OVERFLOW_ERROR:  TransmitChar('0');break; 
18
        case FRAMING_ERROR:   TransmitChar('1');break; 
19
        case UART_ERROR:      TransmitChar('2');break;
20
      }
21
      Flag = NO_ERROR;   // für kein Fehler
22
    }
23
24
    ....

von HulaHup (Gast)


Lesenswert?

Hallo

super, danke dir. Werrde ich machen.

Beste Grüsse

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> HyperTerminal: sollzustand
> _______________________
>  1
das wird mit deinem Code
1
      case 1:  TransmitChar(0x01);break;
sowieso nicht gehen, denn 0x01 ist ungleich '1'.

Karl heinz Buchegger hat es (etwas versteckt automatisch) korrigiert:
1
      case 1:  TransmitChar('1');break;
Erst damit erhältst du die gewünschte 1 in der Anzeige.

von Mat (Gast)


Lesenswert?


von HulaHup (Gast)


Lesenswert?

Hallo

wieso sollte es nicht gehen?
Hexdazimal 1 ist auch in dezimal eine 1 oder irre ich mich?
das sagt auch die verlinkte Ascii tabelle...

oder verträgt die kommunikation kein ehexadezimal schreibweise?

bin etwas verwirrt :(

von Horst (Gast)


Lesenswert?

Das Zeichen '1' hat aber nicht den Zahlenwert eins. Weder dezimal, noch 
binär, noch hexadezimal, noch sonstwie.

von HulaHup (Gast)


Lesenswert?

achso..habs gesehen. hab falsch geguckt

von Horst (Gast)


Lesenswert?

In torstens Tabelle:
Dritte Spalte (Zeichen): 1 hat in den anderen Spalten den Wert 31 (hex) 
bzw. 49 (dec).
TransmitChar(0x31);
TransmitChar(49);
TransmitChar('1');
sollten identisch sein.

von Markus E. (engelmarkus)


Lesenswert?

In der ASCII-Tabelle siehst du, dass das Zeichen '1' einem 0x31 
entspricht. Ein int mit dem Wert 1 entspricht eben gerade nicht dem 
Text-Zeichen mit dem Wert 1.

Zu langsam...

von Q9 (Gast)


Lesenswert?

Er prüft doch gar nicht auf 1 == '1'. Oder übersehe ich das Problem?

von Karl H. (kbuchegg)


Lesenswert?

Q9 schrieb:
> Er prüft doch gar nicht auf 1 == '1'. Oder übersehe ich das Problem?

Du übersiehst das Problem.

Wenn er mittels seiner TransmitChar eine 0x01 ausgibt, dann zeigt das 
Terminal (eine übliche Implementierung von TransmitChar vorausgesetzt) 
mit Sicherheit nicht '1' an, sondern je nach Terminalemulation gar 
nichts oder einen '.' oder sonst irgendein Sonderzeichen um anzuzeigen, 
dass zwar etwas empfangen wurde, das aber kein darstellbares ASCII 
Zeichen ist.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Oder übersehe ich das Problem?
Er sendet eine 0x01 und will auf dem Terminal eine Ascii-1 sehen.

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.