Forum: Mikrocontroller und Digitale Elektronik strcpy kopiert nicht?


von Sebi (Gast)


Lesenswert?

Servus Leute!
Häng jetzt den ganzen Vormittag vor meinem STK500 mit ATMEGA8515 und 
avr-gcc v4.1.
Probleme gibts bei folgendem:

int main( void )
{
  // initialization
  init_USART();

  u08 led, i;

  DDRB=0xff;            /* use all pins on PortB for output */
  led=1;
  char text1[5];

  do
  {
      //hier a bisserl LED-blabla

    USART_Transmit(1);
    strcpy(text1,"hal");

    USART_Transmit(text1[0]);_delay_ms(10);
    USART_Transmit(text1[1]);_delay_ms(10);
    USART_Transmit(text1[2]);_delay_ms(10);

                // ohne strcpy --> funktioniert
    text1[0]='H';text1[1]='A';text1[2]='L';text1[3]=0;
    USART_Transmit(text1[0]);_delay_ms(10);
    USART_Transmit(text1[1]);_delay_ms(10);
    USART_Transmit(text1[2]);_delay_ms(10);

    USART_Transmit(30);_delay_ms(10);
    USART_Transmit(62);_delay_ms(10);
  }
  while(1);
}

Ziel ist es eigentlich nur einen "hal" nach text1 zu kopieren und das 
auf der USART auszugeben. Wenn ich das mit strcpy(text1,"hal"); mache 
kann ich nur 3x 0xff empfangen. Das zweite mal mit der "manuellen 
Zuweisung" klappts und ich kann "HAL" empfangen. 30 und 62 und 1 wird 
auch korrekt übertragen.

Warum funktioniert die strcpy()-Funktion nicht?
Mit
#include "/usr/avr/include/string.h"
hab ich die String.h eingebunden.

Hoffentlich fällt euch was ein,
 Danke schon mal, Sebi

von Michael W. (mictronics) Benutzerseite


Lesenswert?

Eventuell liegts an der String Terminierung.
Probier mal: strcpy(text1,"hal\0");
bzw.
strncpy(text1,"hal",3);

von Sebi (Gast)


Lesenswert?

Danke, habs grad mal ausprobiert:
strcpy(text1,"hal\0")
ergibt auch nix anderes, ich dachte auch die \0 setzt eh strcpy() dran.

strncpy(text1,"hal",3)
ergibt auch nur 3x 0xff

ich hab jetzt auch
char text2[]="bla";
strcpy(text1, text2);
probiert, aber auch das liefert wieder 3x 0xff.

Mhh, das kann doch nicht so schwer sein, oder?

von Sebi (Gast)


Lesenswert?

So,
wen's interessiert, hab das Problem nun endlich gelöst:
Ich hatte die Makefile von einem supersimplen Beispiel genommen, 
allerdings benötigte man für dieses Beispiel wohl nicht den .data 
Bereich. So stand bei mir
$(OBJCOPY) -j .text -O ihex main.out usart.hex
statt
$(OBJCOPY) -j. data -j .text -O ihex main.out usart.hex

Ich seh schon, so ein Makefile kann sich also auch noch als zusätzliche 
Fehlerquelle ergeben...

Viele Grüße
  Sebi

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.