Forum: PC-Programmierung Serielle Schnittstelle öffnen CreateFile(VARIABLE,.)


von Chriss612 (Gast)


Lesenswert?

HalliHallo,

habe ein kleines Problemchen, nach Stundenlangen versuchen eine blöde 
.ini Datei zu lesen (wer kommt denn schon drauf, dass man immer "\\" 
statt "\" machen muss) is es mir letztenedes gelungen es DOCH zu 
schaffen =))

hab dann den Inhalt in nem array gespeichert und per strcpy und strcat 
mit weiteren strings verbunden.

1
strcpy(comport,"\x5C\x5C\x5C\x5C\x2E\x5C\x5C"); //*Hexcode von \\\\.\\
2
  strcat(comport,"COM");
3
  strcat(comport,nummer);

da steht etz quasi: \\\\.\\COM32

so und nun will ich  mit CreatFile den Port öffnen.
Normalerweise würde das ja so aussehen:
1
hFile=CreateFile("\\\\.\\COM32",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0) ;

aber dann müsste ich ja den COMPort immer im Quellcode eingeben und neu 
compilieren, was ja ein bisschen doof is...

dachte mir also ich speicher die COMport nummer in der .ini damit ich se 
im nachhinein ändern kann, OHNE zu compilieren, ergo:
1
hFile=CreateFile(comport,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0) ;


compilieren funktioniert auch einwandfrei keine Fehlermeldung nicht mal 
ein Achtung.

Aber Verbindung kommt keine zu stande:(

Was mach ich falsch?!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Chriss612 schrieb:
> HalliHallo,
>
> habe ein kleines Problemchen, nach Stundenlangen versuchen eine blöde
> .ini Datei zu lesen (wer kommt denn schon drauf, dass man immer "\\"
> statt "\" machen muss)

Das ist eine C-Grundlage. Warum versuchst Du, C-Programme zu schreiben, 
ohne Dich mit den Grundlagen zu beschäftigen?

> is es mir letztenedes gelungen es DOCH zu
> schaffen =))
>
1
strcpy(comport,"\x5C\x5C\x5C\x5C\x2E\x5C\x5C"); //*Hexcode von
2
> \\\\.\\
3
>   strcat(comport,"COM");
4
>   strcat(comport,nummer);


Und warum schreibst Du nicht einfach

  strcpy(comport, "\\\\.\\COM32");

oder

  snprintf(comport, BUFSIZE, "\\.\\COM%d", portnummer);

> aber dann müsste ich ja den COMPort immer im Quellcode eingeben und neu
> compilieren, was ja ein bisschen doof is...

Ja, das ist es.

> dachte mir also ich speicher die COMport nummer in der .ini damit ich se
> im nachhinein ändern kann, OHNE zu compilieren, ergo:
>
>
1
hFile=CreateFile(comport,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
2
> ;
3
>


Da fehlt was. Wie ist "comport" definiert, wie überträgst Du Deine 
"COMport nummer" aus und in die Ini-Datei?

von Chriss612 (Gast)


Lesenswert?

Hallo,

Um die .ini Datei möglichst einfach und verständlich zu halten, soll in 
dieser nur die Nummer des Ports eingetragen werden z.B. 32

Diese Zahl wird dann von
1
GetPrivateProfileString("COMPort","Nummer","Bitte COMPortnummer eintragen", nummer, nummer_size, ini);
ausgelesen und in der Variablen nummer gespeichert.

Da ja COM32>>COM9 ist, benötigt man "\\\.\\" und sowieso das Wörtchen 
COM. Mit:
1
strcpy(comport,"\x5C\x5C\x5C\x5C\x2E\x5C\x5C"); //*Hexcode von \\\\.\\
2
   strcat(comport,"COM");
3
   strcat(comport,nummer);

ändert sich also jenachdem welche Zahl in die .ini Datei gesetzt wird, 
auch der Inhalt der Variablen comport. comport ist als char* definiert, 
damit ich diese dann anstatt "\\\\.\\COMxx" bei CreateFile einsetzten 
kann

Wenn ich aber
1
strcpy(comport, "\\\\.\\COM32");
schreiben würde, wäre die COM-Nummer fix. Aber stimmt mit snprintf wäre 
es etwas schönes aber meine Variante funktioniert auch.
Wenn ich mir nämlich mit printf(comport) anschaue, was gespeichert ist, 
erscheint
1
\\\\.\\COM32
 was ja eigtl genau das ist was brauche.
Ich müsste also nur noch die variable bei CreateFile einsetzten.

Wie gesagt Compilieren geht auch supertoll keine Fehler nichts nur der 
Port öffnet sich nicht. Überwache ihn mit einem Monitor aber nichts 
passiert.

Achja und in der .ini Datei soll nichts gespeichert werden, sondern nur 
die Nummer des Ports ausgelesen werden. Würde zwar über die scanf 
Fuinktin auch gehen aber dann müsste ich ja immer wieder die Nummer 
eintippen. Dank der .ini muss ich dies nur einmal tun.


Vielen Dank schon mal und für die Idee mit snprintf machts gleich 
übersichtlicher =)

von Volker Z. (vza)


Lesenswert?

Hallo,
du brauchst nicht "\\\\.\\COM32"
sondern "\\.\COM32" im String.

Da aber '\' das Escape-Zeichen ist, und die Esc-Sequens für '\' "\\" 
ist, must du es im Quelltext halt jeweils mit doppelten Backslash 
schreiben.

Ansonsten bau dir dein String mit sprintf/snprintf zusammen.

ciao Volker

von Chriss612 (Gast)


Lesenswert?

Oh Gott vielen Dank!!
Das Wars!!
Hab mir mich schon gewundert wieso so viele Backslash da sind...
Wirklich vielen vielen Dank =)))

von Chriss612 (Gast)


Lesenswert?

So nachdem die Schnittstelle nun offen ist, habe ich das nächste 
Problem...
ich versteh das nicht so ganz mit diesem Nokia FBus frames... was hat 
das zubedeuten?

von Karl H. (kbuchegg)


Lesenswert?

Chriss612 schrieb:

> ändert sich also jenachdem welche Zahl in die .ini Datei gesetzt wird,
> auch der Inhalt der Variablen comport. comport ist als char* definiert,

Und da haben wir schon den nächsten Fehler.

Tu dir selbst einen Gefallen und lerne erst einmal die 
Programmiersprache und wie in C gewisse Dinge gehandhabt werden ehe du 
dich in der Windows-Programmierung versuchst.

> Aber stimmt mit snprintf wäre
> es etwas schönes aber meine Variante funktioniert auch.

Tut sie nicht.
Es mag so aussehen als ob.

Solange du
  char* comport
hast, ist das ein kapitaler Fehler, den du da geschossen hast.

von Karl H. (kbuchegg)


Lesenswert?

Chriss612 schrieb:
> Hab mir mich schon gewundert wieso so viele Backslash da sind...

Du sollst dich nicht wundern, sondern ein C oder C++ Buch kaufen, lesen 
und durcharbeiten.

Neben diesem Detail (das sich irgendwo auf den ersten 20 Seiten von 
ungefähr 200 wiederfindet), findest du in deinem neu gekauften Buch auch 
noch viele, viele, viele weitere Informationen und Details, die du 
vorher noch nicht wusstest.

von Chriss612 (Gast)


Lesenswert?

danke für die nett gemeinten tips aber gibt kein fehler mehr,
programm fehlererloscompiliert und funktioniert mit der ini datei

von Karl H. (kbuchegg)


Lesenswert?

Chriss612 schrieb:
> danke für die nett gemeinten tips aber gibt kein fehler mehr,
> programm fehlererloscompiliert und funktioniert mit der ini datei

Wie schon gesagt:
solange du
  char * comport;
im Programm hast und selbst keine Speicherallokierung machst, scheint es 
nur so als ob es funktioniert. Tatsächlich hast du einen schweren 
Fehler. Du kannst das ignorieren so lange du willst. Irgendwann wird es 
dir auf den Kopf fallen. Und erfahrungsgemäss fällt es einem genau dann 
auf den Kopf, wenn der Schaden am größten ist.

"Das Pferd betritt den Feldstecher."
ist ein gültiger deutscher Satz. Er verstößt gegen keine Duden-Regel. 
Trotzdem ist er so falsch wie er nur sein kann.
Dein Compiler kümmert sich in diesem Sinne nur um die Duden-Regeln. Ob 
deine Logik stimmt, ist dein Bier als Programmierer. Die Voraussetzung 
"etwas compiliert fehlerfrei" ist zwar eine notwendige Voraussetzung für 
ein fehlerfreies Programm, aber keine hinreichende.

notwendige Voraussetzung: A muss gegeben sein, damit B überhaupt je wahr
                          sein kann
hinreichende Voraussetzung: Wenn A wahr ist dann reicht das schon, dass
                            B auch wahr ist.

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.