Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » string verarbeitung!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
30.12.2003, 18:31 Uhr
point



Hy an alle bin neu hier und hoffe ihr könnt mir mit meinem Problem helfen!

und zwar folgendes:

Ich arbeite mit einem Microcontroller und muss damit verschiedene Signalformen ausgeben!
Die programmierung ist in c++

Ansteuern tue ich das ganze über Visual Basic und die RS232 schnittstelle!

Ok
ich habe also ein Hauptprogramm void main()
und mein Signalerzeugungsprogramm sinus()

wenn ich jetzt mit VB ein Zeichen an den Microcontroller sende empfängt er dieses als ASCII code also zB "A" in VB ist "65" am Microcontroller!

um das signal ein zu schalten schicke ich einfach A und frage im c programm dann die zahl 65 ab, und schließen tu ich das unterprogramm mit B also 66!

ok bis hierhin kein Problem!

Jetzt aber will ich das programm nicht nur starten sondern zusätzlich die freuqenz ändern!
also ich möchte dann zB in VB A300 eingeben... also A für start und 300 für eine Variable im C programm die mir dann die frequenz bestimmt!

nur wenn ich einfach A300 schicke kommt das ja als ASCII an...
ich möchte jetzt diesen string in A und 300 aufteilen und dann A abfragen und den wert 300 in eine Variable speichern.
also zu erst muss ich irgendwie die Ascii zeichen umwandeln!
gibts dafür irgendeine funktion in c++????
und danach will ich diesen string ich nenn ihn mal BUFFER in A und 300 Aufspalten, hoffe ihr wisst was ich meine...
dH ich will aus einem String 2 machen also aus A300 -> Signal=A und WERT=300

ich hoffe ihr wisst was ich meine und könnt mir helfen!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.12.2003, 18:59 Uhr
0xdeadbeef
Gott
(Operator)


Zunächstmal solltest du statt void main int main benutzen und 0 zurückgeben. Es gibt eine Konvention, dass ein Programm im Erfolgsfall 0 an die Shell zurückgibt, das macht die Programme besser skriptbar.

Also als Gerüst:

C++:
int main(int argc, char *argv[]) {
  /* Hier kommt dein Code */
  return 0;
}


argc ist die Anzahl der Parameter, die übergeben wurden, argv ein string-array, dass die Parameter enthält. Der Name des Programms geht dabei auch als Parameter durch.

Was das Parsen des Strings angeht, nimm sscanf:

C++:
char str[] = "A300";
char c;
int zahl;

sscanf(str, "%c%d", &c, &zahl);


Du solltest auch den Rückgabewert von sscanf überprüfen (sscanf gibt die Zahl der erfolgreich eingelesenen Werte zurück, in diesem Fall also 2).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.12.2003, 00:10 Uhr
Hans
Library Walker
(Operator)


@beefy:
Bist Du sicher, dass es auf einem Controller einen Sinn ergibt, wenn main() etwas zurück gibt? - Ich ehrlich gesagt nicht. An wen oder was denn auch? Soweit ich mich damit auskenne ist main() sowieso das Einzige, das (wahrscheinlich in einer Endlosschliefe) auf dem Controller läuft, wenn man von den Unterfunktionen mal absieht, die main() aufruft.

Was die Standardfunktionen angeht, so weis ich nicht, ob es auch eine controllertaugliche Variante von sscanf() gibt. Aber ich würde einfach den BUFFER ein Byte grösser machen, als das, was maximal darin ankommt, um eine terminierende Null an den String hängen zu können, und dann atoi() nehmen, um den Wert zu erhalten. Als Startadresse für atoi() übergebe ich den BUFFER hinter dem Byte.
Soweit meine ungeprüfte Idee dazu.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.12.2003, 01:10 Uhr
0xdeadbeef
Gott
(Operator)


Er will ja kein Betriebssystem schreiben (dann müsstest du eh auf Assembler zurückgreifen, um die Startsequenz hinzukriegen), sondern von einem bestehenden Windows-System (nur Wind0ze unterstütz Visual Basic) ein Programm ausführen. Damit hat er eine Shell, die im Erfolgsfall 0 erwartet.

Was die Standardfunktionen angeht - wenn sscanf nicht läuft, wird auch atoi nicht laufen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
31.12.2003, 08:59 Uhr
~point
Gast


ne mit int main arbeite ich nicht das würde mir auch nichts bringen... Außerdem arbeite ich ja prinzipiell mit Assembler ich habe nur einen Compiler der mir C++ in Assembler übersetzt und eine Hex file erzeugt die ich dann auf den Microcontroller gebe!

aber ich werde das mit sscanf mal ausprobieren! danke vielmals
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
31.12.2003, 09:09 Uhr
~point
Gast


Hmmm... naja ich habe das jetzt mal so irgendwie versucht aber wie soll ich dann das A abfragen?
habs so probiert

if(c==A)
{
ausgabe();
}

so kommt aber ein fehler weil er dann sagt A = undeklariert...
mit Hochkomma funktionierts auch nicht...??
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
31.12.2003, 09:20 Uhr
~point
Gast


habs schon hab einfach
if(c=='A')
{
ausgabe();
}
funktioniert prima danke!

Nur leider bekomme ich ja auf dem Microcontroller kein A300 sondern nur den ASCII Code dafür also nur: 65514848 ... 65=A 51=3 48=0 48=0... gibts da irgendeine funktion die mir das umwandelt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
31.12.2003, 09:26 Uhr
Tommix



'Morgen,
Du brauchst nur 48 abzuziehen.
Für Dein spezielles Problem könnte es am einfachsten sein, wenn Du mit einer festen Zahl von Stellen arbeitest, also bei Bedarf mit führenden Nullen. Dann gilt z.B.:

C++:
wert = (z0-48)+10*(z1-48)+100*(z2-48);


usw., wobei die Ziffern als z2, z1, usf. empfangen werden.

Gruss und guten Rutsch, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
31.12.2003, 09:28 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


einfach auf dem mikrocontroller nicht als intwerte einlesen sondern als chars
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
31.12.2003, 09:52 Uhr
~point
Gast


danke vielmals für die vielen hilfreichen antworten!

hab jetzt noch ein kleines prob dann seid ihr mich los *G*

also ich will das str[] jetzt dynamisch einlesen also mit cin oder scanf..

habs jetzt mal so probiert:




C++:
char wert;
cin>>wert;
char str[] = "wert";
sscanf(str, "%c%d", &c, &zahl);

if(c=='A')
{
    ausgabe();
}



nur bekomme ich hierbei nicht A für c und nicht 300 für die zahl heraus sondern irgendetwas....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: