www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART ewiges senden?


Autor: HulaHup (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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´


int main(void) 
{
  initmain();
  inituart();
  sei();
  
  DDRD |= 0x05;
  
  while(1) 
  {    
    
    switch(Flag)
    {
      case 0:  TransmitChar(0x00);break; 
      case 1:  TransmitChar(0x01);break; 
      case 2:  TransmitChar(0x02);break; 
    }
    
    if(Address == ID )
    {
      Process();
      Index = 0;
      count=0;
    }
    else ;
  }

return 0;
}


Autor: HulaHup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..fürs bessere verständnis, was ich meine.

HyperTerminal: sollzustand
_______________________
 1




_______________________


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


_______________________

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
   ....

  Flag = 0xFF;   // es gibt keinen Fehler

  while(1) 
  {    
    
    switch(Flag)
    {
      case 0:  TransmitChar('0');break; 
      case 1:  TransmitChar('1');break; 
      case 2:  TransmitChar('2');break;
    }
    Flag = 0xFF;   // für kein Fehler

    ....


du solltest übrigens lieber ein paar #define anstelle dieser Konstanten 
im Code benutzen. Das macht das ganze wesentlich lesbarer

#define OVERFLOW_ERROR   0x01
#define FRAMING_ERROR    0x02
...
#define NO_ERROR         0xFF

...

  Flag = NO_ERROR;

  while(1) 
  {    
    
    if( Flag != NO_ERROR )
    {
      switch(Flag)
      {
        case OVERFLOW_ERROR:  TransmitChar('0');break; 
        case FRAMING_ERROR:   TransmitChar('1');break; 
        case UART_ERROR:      TransmitChar('2');break;
      }
      Flag = NO_ERROR;   // für kein Fehler
    }

    ....

Autor: HulaHup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

super, danke dir. Werrde ich machen.

Beste Grüsse

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

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

Autor: Mat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: HulaHup (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :(

Autor: Horst (Gast)
Datum:

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

Autor: HulaHup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso..habs gesehen. hab falsch geguckt

Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus E. (engelmarkus)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Q9 (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.