Forum: Mikrocontroller und Digitale Elektronik string tutorial für STM32 ?


von Michael L. (nightflyer88)


Lesenswert?

Hallo

Ich befasse mich momentan mit dem STM32 und Emblocks.

Gibt es eine möglichkeit einen Teil eines Strings in einen anderen zu 
kopieren ?

Code:
1
char parameter[][200]; 
2
char txt[100];
3
4
sprintf(parameter[150],"PD15");
5
6
sprintf(txt,"%s\r\n",parameter[150]);
7
USART_send(USART1, txt);

Ich möchte vom string 'parameter' ein oder mehrere Zeichen lesen und per 
Uart ausgeben. Wie genau muss ich dass machen, geht das mit der 
sprintf-funktion ?

Kennt jemand ein gutes Tutorial ?

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Michael L. schrieb:
> Kennt jemand ein gutes Tutorial ?
Ein Buch über C reicht da schon.

von Ich (Gast)


Lesenswert?

Kaj G. schrieb:
> Michael L. schrieb:
>> Kennt jemand ein gutes Tutorial ?
> Ein Buch über C reicht da schon.

Damit die Antwort des äußerst hilfsbereiten Vorposters auch Sinn macht 
ergänz ich das mal:
Es gibt Funktionen für sowas in der Standardbibliothek. <string.h>
strcpy bzw. strncpy, strncat usw.
http://www.tutorialspoint.com/c_standard_library/string_h.htm

von Michael L. (nightflyer88)


Lesenswert?

tiptop ! sowas habe ich gesucht

noch was: in BASIC gibt es die funktion MID(str, start, len) diese gibt 
von einem string (str) von der startposition (start) ein teilstück mit 
länge (len) zurück. Gibts sowas auch in C ? oder muss man das selber 
machen ?

von Marc S. (marc_s86)


Lesenswert?

Naja lies halt len Zeichen ab str+Start.

von DirkB (Gast)


Lesenswert?

Michael L. schrieb:
> char parameter[][200];

Ein leeres Klammerpaar mscht nur Sinn, wenn man das Array auch gleich 
initialisiert.
Dann erkennt der Compiler an der Anzahl der Werte die Größe vom Array.

Zu strncpy sei noch gesagt, dass es den Stringterminator nicht setzt, 
wenn die Maximalzahl der Zeichen kopiert wurde.

strncat macht das. Und bei einem Leerstring als Ziel ist es eine 
Kopie.

von Sebastian S. (amateur)


Lesenswert?

Geh' mal davon aus, dass es kein Tutorial zur Stringbehandlung mit dem 
STM32 gibt.

Geh das Problem einfach folgendermaßen an:
Beschäftige Dich mit den Stringmanipulationsmöglichkeiten unter C. Da 
gibt es bestimmt so einiges und schau dann, notfalls in den 
Headerdateien nach, ob diese Funktionen von Deinem Compiler unterstützt 
werden, bzw. implementiert wurden.

P.S. Die Bücher, die Du im Internet zu C und dessen Anwendung findest 
sind Legion. Auch die zugehörigen Bibliotheken, bzw. deren Beschreibung, 
findest Du dort.

von Michael L. (nightflyer88)


Lesenswert?

besten dank für die tips.

Habe aber trotzdem noch eine frage zu den arrays.

Das sollte ein array erstellen mit 200 elementen, in jedem element 
sollte ein beliebig langer string abgelegt werden können, stimmt das so 
?
1
char parameter[][200];


Im element 150 lege ich jetzt den string "1234" ab, das besagte elemnt 
hat jetzt eine länge von 4. Kann ich jetzt auch den string "12345678" 
hineinschreiben, oder überläuft das element ?
1
strcpy(parameter[150],"1234");

von Won K. (Firma: Outside the Asylum) (the_sane)


Lesenswert?

Michael L. schrieb:
> Das sollte ein array erstellen mit 200 elementen, in jedem element
> sollte ein beliebig langer string abgelegt werden können, stimmt das so
> ?
>
1
> char parameter[][200];
2
>

Nein.
Für ein beliebig langes Element müßte für jedes der 200 Felder der 
gesammte Speicher reserviert werden, denn der ist immer die Obergrenze. 
Das klappt aber schon beim zweiten Feld nicht mehr, da ist schon alles 
vom ersten belegt. Du mußt also eine Obergrenze setzen, die höchstens so 
groß ist wie der verfügbare Speicher geteilt durch 200. Sinnvoll ist das 
aber auch nicht wirklich.
array[] kannst Du nur benutzen, wenn Du gleichzeitig Werte zuweist. Der 
Compiler kann dann die Klammer mit der Länge des größten Werts füllen.
Das kannst Du aber in jedem C-Buch nachlesen.

von DirkB (Gast)


Lesenswert?

Bei deinem Vorhaben musst du über Zeiger und dynamischen Speicher gehen.

Oder du wechselst zu C++. Da kannst du die Klasse std::string nehmen.

Egal welche Sprache du nimmst, du musst sie erstmal lernen.
Mit einem Buch. Da ist auch die Plattform erstmal egal.

von DirkB (Gast)


Lesenswert?

Noch zum Array:
In C kannst du ein (echtes) Array nach der Definition nicht mehr in der 
Größe und Lage verändern.
Ein Array (egal welcher Dimension) ist ein zusammenhängender 
Speicherblock.

Du kannst das, wie schon geschrieben, mit Zeigern und dynamischem 
Speichern umgehen.

von Michael L. (nightflyer88)


Lesenswert?

Besten Dank für eure hilfe. Also ein Buch für C und C++ habe ich bereits 
zur Hand.

In dem Buch stand schon beschrieben dass man die [] Klammern eines 
arrays lehr lassen kann, wenn es direkt initialisiert wird. Ich habe 
dann angenommen, dass es sich bei lehren klammern automatisch anpasst. 
Wie es das bei anderen Sprachen auch gibt.

Nochmals zurück zu C, ich programmiere mit EMblocks, und möchte nun eine 
andere C-datei einbinden:

main.c
1
#include "init.h"
2
3
int main(void)
4
{
5
test();
6
}


init.h
1
#ifndef INIT_H
2
#define INIT_H
3
4
void test();
5
6
#endif /* INIT_H */


init.c
1
#include "init.h"
2
3
void test(){
4
5
}


Der compiler meldet nun einen Fehler, dass die void test() nicht 
gefunden wurde. Nach goooglen muss man in der MAKEFILE die zusätzliche 
C-datei aufführen. Bei Emblocks gibt es aber kein MAKEFILE, was muss ich 
da genau machen ? Die beiden dateien init.c und init.h sollten doch so 
richtig sein ? Ich nehme deshalb an, dass die zusätzlichen dateien 
irgendwo vermerkt werden müssen, damit sie der compiler findet

von DirkB (Gast)


Lesenswert?

Ich kenne Emblocks nicht, aber ...
irgendwo sollte es ein Menüpunkt "Project" geben.
Dort kannst du die benötigten Dateien und Bibliotheken eintragen.

von DirkB (Gast)


Lesenswert?

Michael L. schrieb:
> Besten Dank für eure hilfe. Also ein Buch für C und C++ habe ich bereits
> zur Hand.
Du musst die auch durcharbeiten.
Betrachte C und C++ als zwei verschiedene Sprachen, die außer ein paar 
Schlüsselwörtern nichts gemein haben.


> In dem Buch stand schon beschrieben dass man die [] Klammern eines
> arrays lehr lassen kann, wenn es direkt initialisiert wird. Ich habe
> dann angenommen, dass es sich bei lehren klammern automatisch anpasst.
> Wie es das bei anderen Sprachen auch gibt.
Schließe bei Arrays nie von dem Verhalten anderer Sparachen auf das 
Verhalten von C.

von Carl D. (jcw2)


Lesenswert?

Ist
1
char parameter[][200];
nicht ein Array unbekannter Größe, bestehend aus 200stelligen Zeichen.
Wenn ich den TO richtig verstehe, dann will er das genau andersrum. Und 
Strings sind in C Zeiger auf Zeichenfolgen mit Hex 0 am Ende.
Also
1
// 200 Zeiger auf Zeichenketten
2
char *parameter[200] = {
3
           "PD1",
4
           ...
5
           "PD200"
6
         };
7
char txt[100];
8
// Parameter 150 senden
9
sprintf(txt,"%s\r\n",parameter[150]);
10
USART_send(USART1, txt);
Will man allerdings die "paramenter" zur Laufzeit befüllen, dann braucht 
man eine wie auch immer geartete Speicherverwaltung.

von Michael L. (nightflyer88)


Lesenswert?

DirkB schrieb:
> irgendwo sollte es ein Menüpunkt "Project" geben.

aja, habs gefunden, jetzt läufts ohne fehler


Carl D. schrieb:
> Will man allerdings die "paramenter" zur Laufzeit befüllen, dann braucht
> man eine wie auch immer geartete Speicherverwaltung.

nein für meine zwecke habe ich das so gemacht:
1
char parameter[200][12];

so habe ich 200 parameter mit je 12 zeichen. in der regel habe ich 
zwischen 1 - 10 zeichen pro parameter die ich speichern muss

von Carl D. (jcw2)


Lesenswert?

> Carl D. schrieb:
>> Will man allerdings die "paramenter" zur Laufzeit befüllen, dann braucht
>> man eine wie auch immer geartete Speicherverwaltung.
>
> nein für meine zwecke habe ich das so gemacht:
> char parameter[200][12];

Hättest du mal hingeschrieben. In deinem 1. Post steht davon leider 
nichts. Und wenn das Zielfeld eine feste Länge hat, dann besser:
1
snprintf(parameter[150],sizeof(parameter[150]),"PD15");

Außerdem will printf, das bei der Ausgabe, bei "%s" einen String, d.h. 
mit hex 0 am Ende. Kommandos über 11 Zeichen Länge führen dann zu 
lustigen Fehlern.

: Bearbeitet durch User
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.