WriteFile-Api



  • guten abend allerseits 🙂
    also ich habe folgendes problem:

    ich muss per api auf den com-port zugreifen. dazu verwende ich WriteFile, um daten zu senden. doch leider komme ich mit einem datentyp nicht klar:

    die deklaration von WriteFile lautet: void WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD bytestowrite, DWORD byteswritten, LPOVERLAPPED overlapped);

    nun kann ich aber LPCVOID kein argument übergeben.
    Wenn ich eine variable vom typ LPCVOID deklariere, dann geht das zwar, aber ich kann der variablen überhaupt keinen wert zuweisen.
    LPCVOID ist, glaube ich, ein Array, also habe ich es so versucht:

    lpBuffer[0] = 122;

    oder so:

    DWORD test[] = { 1, 2, 3, 4 };
    LPCVOID lpbuffer = test;

    aber keine einzige dieser möglichkeiten hat funktioniert. wie muss man das sonst machen? und: an den com port sende ich in meinem programm eine zeichenfolge. die besteht ja aus mehreren buchstaben. wie kann ich eine beliebige zeichenfolge in ihre einzelnen zeichen zerlegen, sodass ich die char-werte dann in ein array füllen kann, dass mit WriteFile funktioniert?

    Hoffe mir kann jemand helfen, vielen dank schon im voraus.

    grüsse & schönen abend!



  • Ich Rate Dir ganz dringen für die serielle Kommunikation eine fertige Klasse zu verwenden; das hört sich nämlich zuerst mal alles ganz einfach an; ist es aber nicht!
    http://www.codeproject.com/system/serial.asp



  • hallo jochen,
    ja das wäre natürlich sehr bequem.
    doch an den seriellen port kommt dann einen schaltung mit mc dran, die ich selber entwickelt habe. so muss das programm auch gewisse eigenheiten dieser schaltung beachten, d.h. es muss in gewisser weise anpassbar sein, darum würde ich den code gern selber schreiben wenns geht, weil ich dann gleich von jedem codeschnipsel weiss, wo was zu finden ist. so kann ich die klasse dann jederzeit ändern, wenn ich was ändern sollte.

    grüsse



  • Aber Dein Probkem mir WriteFile verstehe ich nicht...

    char zeichen[] = {0, 1, 2, 3, 'a', 'c', '\n', 0, 88, 0x5};
    size_t size = sizeof(zeichen);
    DWORD dwWritten;
    WriteFile(hFile, zeichen, size, &dwWritten, NULL);
    


  • so einfach hatte ich das noch nie probiert!
    aber es geht, danke!

    jetzt habe ich nur noch ein problem:

    wie kann man eine beliebige zeichenfolge, die man aus einer etxtbox hat, z.b. "Hallo Welt" in die einzelnen zeichen umwandeln?

    aus "Hallo" würde ich dann ein char-array bekommen mit {'h', 'a', 'l'. 'l', 'o'}.

    weisst du wies geht??

    grüsse



  • CString s;
    s = _T("Hallo Welt");
    
    HANDLE hFile;
    DWORD dwWritten;
    WriteFile(hFile, (LPCTSTR) s, s.GetLength() * sizeof(TCHAR), &dwWritten, NULL);
    


  • ok, vielen dank. ich versuchs gleich!!

    grüsse



  • Es sei noch angemerkt, das "CString" abhängig von den Compiler-Einstellungen entweder ANSI oder UNICODE ist!
    Falls Du wirklich nur ANSI/ASCII senden willst, soilltest Du "CStringA" verwenden! und dann natürlich auch das "* sizeof(TCHAR)" entfernen...


Anmelden zum Antworten