Forum: Compiler & IDEs Uart String empfangen


von Peter (Gast)


Lesenswert?

Hallo,

ich möchte mit einem Mega8 Strings per Uart empfangen. Basis ist dabei 
die Lib von P. Fleury. Ich schicke Strings vom PC an den µC und wenn 
dort der String komplett angekommen ist soll er zurück zum PC geschickt 
werden. Leider kommt der String häufig unvollständig zurück.
1
void uart_gets(char *test)
2
{
3
  char c;
4
  c = uart_getc();
5
  if(!(c & UART_NO_DATA))
6
  {
7
  *test = c;
8
  do {
9
    test++;
10
    *test = uart_getc();
11
    }while(*test != '\0');
12
  }
13
}
14
int main(void) 
15
{
16
  ck_1000 = 0;
17
  sei();
18
  uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
19
  adc_init();      
20
  while(1)
21
  {
22
    char test[20] = "";  
23
    uart_gets(test);  //Serielle Daten empfangen
24
    uart_puts(test);  //Serielle Daten zur Kontrolle 
25
        }
26
  return 0;
27
}
Hat jemand einen Tip wo es hakt?

Schönen Abend

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:


> void uart_gets(char *test)
> {
>   char c;
>   c = uart_getc();
>   if(!(c & UART_NO_DATA))
>   {
>   *test = c;
>   do {
>     test++;
>     *test = uart_getc();

Du musst nach JEDEM uart_getc() Aufruf überprüfen, ob uart_getc ein 
Zeichen für dich hat! Nicht nur beim ersten!

Die Übertragung von Zeichen ist wesentlich langsamer als diese Schleife 
hier. d.h. in dieser Schleife wird nur ab und zu von uart_getc() ein 
Zeichen geliefert werden. Die meiste Zeit wird uart_getc() mit gesetzten 
UART_NO_DATA Bit zurückkehren. Und nur dann, wenn UART_NO_DATA nicht 
gesetzt ist, ist wieder ein Zeichen eingetrudelt, welches du an den 
String anhängen kannst.

von Peter (Gast)


Lesenswert?

Habe versucht deine Infos in die Empfangsroutine einfließen zu lassen, 
klappt leider noch nicht so richtig:
1
void uart_gets(char *test)
2
{
3
  char c;
4
  c = uart_getc();
5
  if(!(c & UART_NO_DATA))
6
  {
7
  *test = c;
8
  test++;
9
  do {
10
    if(!(c & UART_NO_DATA))
11
    {
12
      *test = uart_getc();
13
      test++;
14
    }
15
    }while(*test != '\0');
16
  }
17
}

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Habe versucht deine Infos in die Empfangsroutine einfließen zu lassen,
> klappt leider noch nicht so richtig:
> [c]
> void uart_gets(char *test)
> {
>   char c;
>   c = uart_getc();
>   if(!(c & UART_NO_DATA))
>   {
>   *test = c;
>   test++;
>   do {
>     if(!(c & UART_NO_DATA))
>     {
>       *test = uart_getc();
>       test++;

Du gehst immer noch davon aus, dass das was von uart_getc() kommt ein 
gültiges Zeichen ist.

Du musst das, was du von uart_getc() bekommst TESTEN, ob UART_NO_DATA 
nicht gesetzt ist, und nur dann wenn UART_NO_DATA nicht gesetzt ist, 
erst dann kannst du es durch Zuweisung an *test an den String anhängen!

Es hilft dir nichts, wenn du immer nur c abtestest, ob UART_NO_DATA 
gesetzt ist. c hat mit dem LETZTEN Aufruf von uart_getc() nix zu tun!

Du hast zwar dein Programm ein wenig umgestellt, aber du hast an der 
Logik nichts geändert. Das Grundübel ist immer noch das gleiche.

von Karl H. (kbuchegg)


Lesenswert?

Ausserdem muss c ein unsigned int sein!
Siehe die Doku von P.Fleury

1
void uart_gets(char *test)
2
{
3
  unsigned int c;
4
5
  c = uart_getc();
6
  if(!(c & UART_NO_DATA))
7
  {
8
    *test = c;
9
    test++;
10
11
    do {
12
      c = uart_getc();
13
      if(!(c & UART_NO_DATA))
14
      {
15
        *test = c;
16
        test++;
17
      }
18
    } while( c != '\0');  // da ist das Bit UART_NO_DATA implizt mit drinnen
19
                          // die Schleife läuft also auch weiter, wenn
20
                          // kein Zeichen angekommen ist.
21
  }
22
}


Edit: Bist du sicher, dass der Sender die Übertragung eines Strings mit 
einem '\0' beendet? Es ist zwar nicht unmöglich, aber eher unüblich das 
zu tun.

von Peter (Gast)


Lesenswert?

Geht jetzt, vielen Dank für deine Hilfe!

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.