Hallo zusammen,
ich habe folgendes Problem:
Ich sende einen String den ich aus einer Datei lese per UART an den MCU
(atmega 2560). Dort will ich aus diesem mit strstr() X und Y Koordinaten
extrahieren.
Leider bleibt der Code in der While-Schleife hängen da scheinbar
strstr() nie einen NULL Pointer zurück gibt. Ist der NULL Character '\0'
zur Beendung des Strings falsch gesetzt?
Ich kann meinen Fehler leider nicht finden. Vielleicht könnt ihr mir
helfen!?
Ich sende den String: "G01 X69.204775 Y23.337389 Z-0.100000 G01
X80.964849 Y21.666507 Z-0.100000 G00 Z0.100000 (End cutting path id:
path4285"
Zurück bekomme ich am Serial Port:
strstr liefert nur zurück ob der gesuchte String enthalten ist. Der
String ändert sich auch nicht, deswegen hängst du in deiner while
Schleife.
Auch solltest du überprüfen, ob der empfangene String größer als dein
Buffer ist.
Hans L. schrieb:> while( (hier = strstr(uart_string, "G01 X")) != NULL){> strncpy(x_values[0],hier+5,6);> strncpy(y_values[0],hier+5+11,6);> number_of_coordinates++;> USART_Transmit('p');> }
Suche wird immer an der gleichen Stelle fortgesetzt!
1
char*pNext;// !!!!
2
3
intmain(void)
4
{
5
intchar_counter=0;
6
USART_Init(MYUBRR);
7
while(uart_char!='('){
8
uart_char=USART_Receive();
9
uart_string[char_counter]=uart_char;
10
char_counter++;
11
}
12
uart_string[char_counter]='\0';
13
14
for(inti=0;i<sizeof(uart_string);i++){
15
USART_Transmit(uart_string[i]);
16
}
17
18
char*hier;
19
charx_values[50][7];
20
chary_values[50][7];
21
intnumber_of_coordinates=0;
22
USART_Transmit(sizeof(uart_string));
23
24
pNext=uart_string;//!!!!
25
26
while((hier=strstr(pNext,"G01 X"))!=NULL){//!!!!
27
strncpy(x_values[0],hier+5,6);
28
strncpy(y_values[0],hier+5+11,6);
29
number_of_coordinates++;
30
USART_Transmit('p');
31
pNext=hier;// !!!! hier wird bei der Suche weiter gesprungen
Stefanus F. schrieb:> Der Kopiervorgang ist allerdings wesentlich teurer, als den Zeiger zu> versetzen.
Das ist der Grund warum C schneller ist als so mach andere Sprache ist.
Zeiger machen es möglich. Aber es ist gefährlich wenn man nicht weiß was
man damit anstellt.
Hans L. schrieb:> strncpy(x_values[0],hier+5,6);
Das funktioniert nicht so, wie du dir das vorstellst.
Wenn in den 6 Zeichen keine '\0' gefunden wird, wird auch keine kopiert.
Der String in x_Values ist nicht terminiert.
Warum überhaupt der Umweg über das 2D-char-Array.
atof hört da auf, wo es keine gültig Zahl erkennt.
Warum überhaupt atof, wenn du eigentlich atoi möchtest.
besser noch strtoul.
Vorteil :
-weniger Variable
-weniger Code
-vermutlich wesentlich schneller
-leichtere Ausbaufähigkeit
Auch für Prozessoren mit wenig SRAM geeignet, da strstr() ein
Speicherfresser ist.
GEKU schrieb:> while (*px)
man könnte auch mit "while (uart_char)" direkt die Zeichen vom UART
einlesen und im SWITCH die Abbruchbedingung exekutieren.
GEKU schrieb:> man könnte auch mit "while (uart_char)" direkt die Zeichen vom UART> einlesen und im SWITCH die Abbruchbedingung exekutieren.Vergessen , geht nicht so einfach, da mehrere Zeichen für FLOAT
Variable gelesen werden müssen
Hallo zusammen,
vielen Dank, dass ihr euch so viel Zeit genommen habt und meine Frage so
detailliert beantwortet habt!
Ihr habt mir sehr geholfen und ich konnte auch viel dabei lernen!
Ich habe es jetzt so umgesetzt wie oben vorgeschlagen.
Echt klasse!!!