Forum: Compiler & IDEs UART Strings schicken funktioniert nicht


von Martin (Gast)


Lesenswert?

Hallo
habe folgendes Programm: Wenn von einem JAVA Programm aus über die 
Serielle Schnittstelle in diesem Fall ein "A" geschickt wird soll die 
LED am Pin 7 am Port A leuchten. Andernfalls soll sie ausgeschaltet 
bleiben. Aber nach meine Programm nach geht da gar nichts. Meiner 
Meinung nach passt bei dem Befehl uart_gets etwas nicht, weil wenn ich 
Integer werte sende funktioniert alles perfekt.

uint8_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)))
          ;
    return UDR;
}


void uart_gets( char* Buffer, uint8_t MaxLen )
{
  uint8_t NextChar;
  uint8_t StringLen = 0;

  NextChar = uart_getc();         // Warte auf und empfange das nächste 
Zeichen

                                  // Sammle solange Zeichen, bis:
                                  // * entweder das String Ende Zeichen 
kam
                                  // * oder das aufnehmende Array voll 
ist
  while( NextChar != '\n' && StringLen < MaxLen - 1 )
  {
    *Buffer++ = NextChar;
    StringLen++;
    NextChar = uart_getc();
  }

                                  // Noch ein '\0' anhängen um einen 
Standard
                                  // C-String daraus zu machen
  *Buffer = '\0';
}



main:

int main ()
{
  uint8_t a=0;
  char line[8];
  char line2[8]= "A";

  init();

  while(1)
  {
    if ( (UCSRA & (1<<RXC)) )
    {
      uart_gets(line,8);


      if(strcmp(line,line2)==0)
      {
        PORTA|= (1<<PA7);
      }
      else
      {
        PORTA&= ~(1<<PA7);
      }


    }
  }

  return 0;

}

von Lars (Gast)


Lesenswert?

ändere mal:

uart_gets(line,8);

in:

uart_gets(line,2);

von Martin (Gast)


Lesenswert?

Okey super danke funktioniert jetzt soweit! Aber ein Problem ist noch, 
dass ich das "A" zweimal schicken muss damit die LED reagiert

von Lars (Gast)


Lesenswert?

Ok.
Das was ich geschrieben hab, war eher nur ein Workaround, bzw Test, um 
zu sehen, woran es liegt.

Die Funktion "uart_gets" erwartet eigentlich, dass Du ein "A" schickst 
und danach ein '\n',
also ein "ENTER".
Je nach OS kann das aber ein "\n" oder ein "\n\r" sein.
Außerdem darfst Du dann nicht mehr mit char line2[8]= "A"; vergleiche, 
sondern mit "A\n"

Du kannst natürlich anstatt einen String zu vergleichen, auch einfach 
nur einzelne Zeichen vergleichen. Dein Code würde dann so aussehen:
1
uint8_t uart_getc(void)
2
{
3
    while (!(UCSRA & (1<<RXC)))
4
          ;
5
    return UDR;
6
}
7
8
9
10
main:
11
12
int main ()
13
{
14
  char zeichen;
15
  char zeichen2= 'A';
16
17
  init();
18
19
  while(1)
20
  {
21
    if ( (UCSRA & (1<<RXC)) )
22
    {
23
      zeichen = uart_getc();
24
25
26
      if(zeichen == zeichen2)
27
      {
28
        PORTA|= (1<<PA7);
29
      }
30
      else
31
      {
32
        PORTA&= ~(1<<PA7);
33
      }
34
35
36
    }
37
  }
38
39
  return 0;
40
41
}

von Martin (Gast)


Lesenswert?

Okey und mal angenommen ich würde eine String zb "Hallo" vergleichen 
wollen? Was wäre da anders?

von Lars (Gast)


Lesenswert?

Dein PC schickt ein H .. dann ein A ... dann ein L .. soll jetzt schon 
verglichen werden ? dann ein L .. jetzt vergleichen .. dann ein O .. 
soll man jetzt vergleichen .. dann ein ... moment ... moment ... ja 
kommt kein Zeichen mehr ?

Das Problem ist, dass dein Mikrocontroller wissen muss, WANN er den 
Vergleich, ob es ein "HALLO" war starten soll.

Du solltest deshalb kein "HALLO" senden, sondern ein "HALLO+enter", was 
ein "HALLO\n" wäre.

Deine erste Software wartet auf das "ENTER".

Schick also in der ersten Software von Dir einfach mal ein "A\n"

von Martin (Gast)


Lesenswert?

Okey jetzt funktioniert das ganze, hab wirklich bei der JAVA Software 
das \n vergessen ;-)
Danke für die 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.