Software UART Problem

OP #2477869
Lesenswert?

Hi,

ich nutze gerade die Software UART Bibliothek von Peter Dannegger: 
Beitrag "Software UART".

Das Programm ist soweit in Ordung, aber ein Problem tritt auf mit dem 
folgenden Code.
1
#include "main.h"
2
#include "suart.h"
3

4

5
int main( void )
6
{
7
  Initialization();
8
  suart_init();
9
  
10
  __enable_interrupt();
11
  
12
  for(;;)
13
  {        // main loop
14
    while( !kbhit() );      // wait until byte received
15
   
16
    sputchar(sgetchar());
17
    if (sgetchar() == '\n')
18
    {
19
      sputchar(0x5A);
20
    }
21
  }
22
}
23

24
void Initialization(void)
25
{   
26
    CLKPR = (1<<CLKPCE);        // set Clock Prescaler Change Enable
27
        
28
    // set prescaler = 8, Inter RC 8Mhz / 4 = 2Mhz
29
    CLKPR = (1<<CLKPS1); 
30
}

Man erwartet folgendes:

1. Bei Eingaben ungleich '\n'(0x0A): das selbe Zeichen wird 
zurückgesendet.
2. Bei Eingaben gleich '\n': 0x0A und 0x5A werden zurückgesendet.

In der Wirklichkeit sieht es so:
1. Bei Eingaben ungleich '\n'(0x0A): das selbe Zeichen wird bei allen 
zwei Eingaben zurückgesendet.
2. Bei Eingaben gleich '\n': Entweder 0x0A oder 0x5A wird bei jeder 
Eingabe zurückgesendet.

Wo liegt der Fehler?

Übrigens ist es möglich, eine Zeichenkette von 10 Zeichen mit dieser Bib 
zu empfangen?

Gruss
Owen
#2477917
Lesenswert?

Owen Senmeis schrieb:

> Man erwartet folgendes:
>
> 1. Bei Eingaben ungleich '\n'(0x0A): das selbe Zeichen wird
> zurückgesendet.
> 2. Bei Eingaben gleich '\n': 0x0A und 0x5A werden zurückgesendet.

Eigentlich nicht.

Mit dem Code
1
    sputchar(sgetchar());
2
    if (sgetchar() == '\n')
erwartet das kaum jemand.
sgetchar() liefert das nächste Zeichen. Direkt von der UART! Wenn du es 
erst mal gelesen hast, dann ist es innerhalb sgetchar() nicht mehr 
verfügbar. Wenn du also JEDES empfangene Zeichen untersuchen willst, ob 
es \n ist, dann musst du dir das schon selber in einer Variablen merken, 
damit du dann auch wirklich das empfangene Zeichen untersuchen kannst, 
nachdem du es zurückgeschickt hast.
1
    zeichen = sgetchar();
2
    sputchar( zeichen );
3
    if( zeichen == '\n' )
4
      sputchar( 'Z' );

> Übrigens ist es möglich, eine Zeichenkette von 10 Zeichen
> mit dieser Bib zu empfangen?
Wenn du dir eine entsprechende Funktion schreibst: Sicher. Was sollte 
dich daran hindern?

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