RS232 0x00 Senden mit seltsamen verhalten.

OP #977478
Moin,

habe gerade ein sehr seltsames Verhalten bei meiner Programmierung 
festgestellt. Hab an meinem Atmega32 einen MAX232 mit 38400 Bauds und 
einem externen Quartz mit 16 MHz.

Die Übertragung klappt schon seit längeren ordentlich und es gab bis auf 
jetzt nie Probleme. Wenn ich jetzt doch ein Byte 0x00 übertrage werden 
die folgend übertragenden Bytes unabhängig vom übergebenen Wert auch mit 
0x00 übertragen. Kurze Zeit später läuft die Kommunikation wieder 
ordentlich.

Hab jetzt erstmal folgende Anpassung an das Programm gemacht:
1
/**
2
 * Sendet ein einzelnes Zeichen
3
 * an die RS232 Schnittstelle 
4
 */
5
void serial_putc(unsigned char data) 
6
{
7

8
  /* Wait for empty transmit buffer */
9
  while ( !( UCSRA & (1<<UDRE)) )
10
       ;
11
  /* Put data into buffer, sends the data */
12
  UDR = data;
13

14
  if (data == (unsigned char)0x00)
15
    _delay_ms(10);
16
  
17
} // serial_putc

Allerdings sollte so eine Bremse doch normalerweise nicht nötig sein, 
wenn ich auf die Hardware-Flags für die Übertragungsbereitschaft warte?

Falls jemand das auch schon mal gesehen hat, oder einen Tip für den 
Ursprung kennt...gerne!

Grüße

Thomas
Gast
>Falls jemand das auch schon mal gesehen hat, oder einen Tip für den
>Ursprung kennt...gerne!

Der Ursprung dürfte vor dem Aufruf der Funktion liegen...
OP
Moin,

habe das Programm mal kurz gestuzt, auf den wesentlichen Teil.

Die RS232 Init Routine sieht folgendermassen aus:
1
void initSerial(void) 
2
{
3
  /* Set baud rate (38400) */
4
  UBRRH = (unsigned char)(25>>8);
5
  UBRRL = (unsigned char)25;
6
  /* Enable receiver and transmitter */
7
  UCSRB = (1<<RXEN)|(1<<TXEN);
8
  /* Set frame format: 8data, 2stop bit */
9
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
10
  
11
} // initSerial

und die main jetzt:
1
int main(void) 
2
{
3

4
    // Serielle Schnittstelle vorbereiten
5
    initSerial();
6

7
    int x;
8

9
    for (x=0;x<16;x++)
10
      serial_putc(0x00);
11
    for (x=0;x<24;x++)
12
      serial_putc(0xFE);
13
}

Leider aber immer noch mit dem gleichen Ergebnis.
Gast
> Wenn ich jetzt doch ein Byte 0x00 übertrage werden die folgend
> übertragenden Bytes unabhängig vom übergebenen Wert auch mit 0x00
> übertragen.

Wie stellst du das fest?
Gast
Mal ne Frage:

In der Zeile:
1
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
stellst du zwei Stoppbits ein.
Da das eher selten ist:
Hast du das im Terminalprogramm berücksichtigt?

bzw.  hast du dir den Tx-Pin mal mit dem Oszi angesehen?
Matthias Lipinsky wrote:

> stellst du zwei Stoppbits ein.
> Da das eher selten ist:
> Hast du das im Terminalprogramm berücksichtigt?

Wenn man 2 Stoppbits sendet, ist es egal, ob am Empfänger 1 oder 2 
Stoppbits eingestellt sind.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 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.