Uart String empfangen

Gast #2778823
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
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
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
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
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

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