Forum: Mikrocontroller und Digitale Elektronik Code funktioniert in main(), aber nicht über Funktion?


von Axel R. (axelroro)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
hoffe Ihr könnt mir helfen - ich stecke an ein einer Banalität fest.

Ich rufe in Programm bin_io_test_v1 die Funktion fgets zum Einlesen 
eines Strings auf zwei Arten auf:

a) Einmal direkt in main() - der z.Z. auskommentierte Code. Dann 
funktioniert das wunderbar.
b) Und zum zweiten über die Funktion UART_readline, welche den 
identischen Code in eine Funktion auslagert. Dann läuft er mir glatt 
über die fgets funktion hinweg, ohne auf Eingabe zu warten.

Macht gerade keinen Sinn. Verdächtigt habe ich bis jetzt:
- Die Benutzung von fdevopen (laut FAQ nicht reentrant)
- Uart nutzt interrupts für get und put

Im Detail (Kompletter Programmcode attached).
  /* Ask for command and store result in string s */
  UART_readline(PSTR("Enter command. \r\n"), s);

  /* Ask for command and store result in string s */
  /*printf_P(PSTR("Enter command. \r\n"));

  wdt_disable();
  fgets(s, sizeof(s)-1, stdin);
  wdt_enable(WDTO_500MS);

  s[strlen(s)-2] = 0;  // drop the ending \r\n
  printf_P(PSTR("You entered '%s'\r\n"),s);

  */

Nutze AVR Studio.

Irgendwelche Ideen, an was das liegen mag?

Danke
Axel

von ... (Gast)


Lesenswert?

Dein Problem ist "sizeof(s)-1". Wenn Du das so in der Funktion benutzt 
kommt da 1 (EINS) raus!
Der Datentype von s ist "char*"! Und in im avr-gcc sind nun mal alle 
Pointer 2 Byte groß.

von Axel R. (axelroro)


Lesenswert?

Hallo Gast,
das wars. Hab jetzt mal einen size parameter mit eingebaut und mit 
sizeof(s)/sizeof(s[0]) gefüllt.

Danke für die Hilfe!

Grüsse
Axel

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.