RS232 Probleme bei der Kommun. mit PC

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • RS232 Probleme bei der Kommun. mit PC

      Hallo,
      ich habe einige Kommunikationsprobleme bei der Kommunikation mit dem PC über die RS232!
      Atmega16A <--> Windows7 PC, Baudrate 2400
      Hier mal der kleine Programmteil:

      Do
      IF UCSR0A.RXC = 1 Then 'UART-Empfangsregister (Mega8=UCSR.RXC)

      LSBByte = UDR
      waitms 20
      MSBByte = UDR

      BB = MSBByte * 256
      Empf = BB + LSBByte
      Addr = Empf

      GOSUB AnzAddr 'Anzeige Adresse
      GOSUB AnzDaten 'Anzeige Daten
      GOSUB AnzDatHex
      GOSUB AnzAddHex

      Daten = Daten + 1
      'PrintBin Daten

      'GOSUB WriteAddr
      'GOSUB WriteDaten

      Toggle LED

      End IF
      Loop
      End

      Und zwar funktioniert das Programm ganz gut wenn ich keine Daten sende (Printbin ist noch auskommentiert).
      Empfangen werden zwei Bytes und gesendet nur ein Byte.
      Ich empfange korrekte Daten und die LED Toggelt jedesmal, wenn ein Word empfangen wurde. Die Wartezeit
      zwischen dem Auslesen des UDR - Registers muß bei dieser Baudrate min 11ms sein.
      Sende ich zusätzlich Daten dann kommen die Eigangsdaten vom PC nicht korrekt an und die Schleife ist ständig
      aktiv (LED toggelt und Daten werden dauernd incrementiert). Denke das UCSR0A.RXC - Register wird nicht 0!
      Kann es sein, dass der Printbin - Befehl meine UART neu konfiguriert?
      Habt ihr für meine Anwendung ein gutes Beispiel? Es wurde schon viel darüber geschrieben aber ...

      Danke und schönen Sonntag noch
      Jürgen
    • Das einfachste ist, du richtest einen serialin-Buffer ein
      (Config Serialin=Buffered...)

      Und dann drägst du einfach in der Schleife mit IsCharWaiting() ab, ob was im Buffer ist oder nicht.
      Wenn ja, dann einfach mit InputBin einen Wordwert einlesen.

      Dim DatenWord as Word

      If IsCharWaiting()=True then
      Inputbin Datenword
      End If

      und fertig ist das ganze.

      Senden genauso.

      Wenn du Printbin WordData schreibst, wird der Word-Wert wieder gesendet.

      Das schöne dabei, dass Variablen immer im Format LowByte-HighByte gesendet werden.
      Ein zusammensetzen des Word-Werts ist nicht notwendig. Ausnahme, es werden Datem im Format HighByte-LowByte gesendet.
    • Danke für den Hinweis. Ich habe immer gedacht, dass ich den Puffer leere indem ich UDR auslese. Als dies nicht
      funktioniert hat, habe ich noch 4 mal den Puffer in eine Dummy-Variable geschrieben aber UCSR0A.RXC blieb auf 1.
      Sogar das Kabel abgezogen aber mein Atmel meinte immer noch er empfängt Daten! Auch ein Clear SerialInX half
      nicht.
      Probiere dann mal Deinen Vorschlag aus. Zu erwähnen ist auch noch, das ich keine Char empfange sondern reine Zahlen!
      Danke erst mal
    • UDR ist ein Register und nimmt das gerade empfangene Byte auf.
      Wenn man so will ist es ein harwar-Buffer mit exact 1 Byte größe.

      Den Buffer leert man nicht, indem man UDR ausliest.
      Damit löscht mal allenfals das Interrupt-Flag, wenn man das in der ISR tut.

      Um dem UART mitzuteilen, dass das Byte ausgelesen ist, kann man auch das Interrupt-Flag URXC löschen,
      was man auch tun sollte, wenn man keine ISR verwendet.