UART ewiges senden?

Gast #1416075
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
..fürs bessere verständnis, was ich meine.

HyperTerminal: sollzustand
_______________________
 1




_______________________


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


_______________________
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
> 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
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 :(
Gast
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.
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.