Forum: Compiler & IDEs Anfängerfrage zu strlen


von Bitkipper (Gast)


Lesenswert?

Hallo,

ich versuche mit dem folgenden Code die Länge eines Strings zu 
ermitteln.
1
#include <string.h>
2
char CMD_String[32];
3
4
...
5
6
7
strcpy( CMD_String, "Hallo Welt" );
8
  
9
   
10
    while (1) 
11
    {
12
    
13
    volatile int Laenge = strlen(CMD_String); // <------
14
    for (len = 0; len < Laenge ; len++);
15
    {
16
       bufferAddToEnd  (&UART0_TX_Buffer,CMD_String[len]); 
17
    }
18
    UCSR0B |= (1<< UDRIE0); // USART0 Data Register Empty Interrupt Enable
------------------
Der Code liefert als Stringlänge immer eine 0 zurück, wo liegt mein 
Fehler?

Danke

von Rene H. (Gast)


Lesenswert?

Hmm, ich sehe da keinen Fehler. Dann liegt es vermutlich an dem Code den 
du uns nicht zeigst.

von Kaj (Gast)


Lesenswert?

Funktioniert bei mir einwandfrei...

Bitkipper schrieb:
> Der Code liefert als Stringlänge immer eine 0 zurück
Woher weißt du das? Wie hast du das festgestellt?

von Bitkipper (Gast)


Lesenswert?

Hallo,

hier mal das komplette main.c file
1
#include "global.h"
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
#include <string.h>
6
#include "AVRlib/buffer.h"
7
8
#define  buffer_size   32
9
char UART0_TX_Buffer_String[buffer_size];
10
cBuffer UART0_TX_Buffer;
11
char CMD_String[32];
12
13
14
ISR( USART0_UDRE_vect ) 
15
  {
16
    UDR0 = bufferGetFromFront (&UART0_TX_Buffer);
17
    if (UART0_TX_Buffer.datalength = 0)
18
    {
19
      UCSR0B &= ~(1<< UDRIE0); // USART0 Data Register Empty Interrupt Disable
20
    }
21
  }
22
  
23
void InitUart0 (void)
24
{
25
  // UART0
26
  UBRR0 = (config_UBRR0 & 0x0FFF);    // Baudrateneinstellung nur die niederwertigsten 12Bit
27
  UCSR0B |= (1<<TXEN0);          // Enable TX Funktion 
28
}
29
30
31
32
int main(void)
33
{  
34
  uint8_t len = 0;
35
  // Debug
36
   DDRB = 0x00;
37
   DDRB |= (1<<PB0)| (1<<PB1);
38
   // Init Sendebuffer für UART0
39
   bufferInit(&UART0_TX_Buffer, UART0_TX_Buffer_String, buffer_size);
40
   
41
  InitUart0();  // UART0
42
  
43
  UCSR0B |= (1<< UDRIE0);          // USART0 Data Register Empty Interrupt Enable
44
  sei();
45
46
  strcpy( CMD_String, "Hallo Welt" );
47
  
48
   
49
    while (1) 
50
    {
51
    
52
    
53
    volatile int Laenge = strlen(CMD_String);
54
    for (len = 0; len < Laenge ; len++);
55
    {
56
       bufferAddToEnd  (&UART0_TX_Buffer,CMD_String[len]); 
57
    }
58
    UCSR0B |= (1<< UDRIE0); // USART0 Data Register Empty Interrupt Enable
59
    
60
  }
61
}

Zur Frage von Kaj:
Ich habe auf der for.. Zeile einen Breakpoint gesetzt und über die 
Watchfunktion den Variableninhalt von Laenge kontrolliert.

Umgebung:
- Win 10
- AVR Studio 7
- Controller AT Mega 644PA

Danke

von Walter S. (avatar)


Lesenswert?

Bitkipper schrieb:
> cBuffer UART0_TX_Buffer;
was bedeutet diese Zeile?

>     if (UART0_TX_Buffer.datalength = 0)
das ist bestimmt nicht gewünscht,
Warnings einschalten UND beachten

von Dirk B. (dirkb2)


Lesenswert?

Bitkipper schrieb:
> Ich habe auf der for.. Zeile einen Breakpoint gesetzt und über die
> Watchfunktion den Variableninhalt von Laenge kontrolliert.

Möglicherweise existiert die "Variable" nur im Register.

Es ist ungünstig, zweimal durch den String zu gehen
1
    for (len = 0; CMD_String[len] != '\0' ; len++);
2
    {
3
       bufferAddToEnd  (&UART0_TX_Buffer,CMD_String[len]); 
4
    }
macht das in einem Durchgang.

von for (Gast)


Lesenswert?

Walter S. hat ja schon fast alles gesagt.

Von mir: Deine For-Schleife wird unendlich oft aufgerufen, der TX-Buffer 
wird überlaufen, noch bevor die Software was senden kann.

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.