UART Strings schicken funktioniert nicht

Gast #2324925
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;

}
Gast #2324949
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
}
Gast #2324974
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"

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