Anfängerfrage zu strlen

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.