Uart String empfangen

Gast #2778823
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
#2778844
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.
Gast #2778858
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
}
#2778864
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.
#2778871
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.

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