Anfängerfrage zu strlen

Gast #4580302
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
Gast #4580402
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
#4580940
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.

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