Forum: Compiler & IDEs Software UART Problem


von Owen S. (senmeis)


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

von Walter S. (avatar)


Lesenswert?

nur jedes 2.Mal wird das Zeichen getestet

von Karl H. (kbuchegg)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.