UART ewiges senden?

Gast #1416075
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
}
Gast #1416083
Lesenswert?

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

HyperTerminal: sollzustand
_______________________
 1




_______________________


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


_______________________
#1416094
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
    ....
Moderator (Firma: Titel) Persönliche Seite #1416169
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.
Gast #1416274
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 :(
#1416346
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.

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