(mal wieder)com port + WriteFile
-
Ich weiss, das Thema ist mittlerweile ausgelutscht, aber ich bekomme es immernoch nicht hin.
Das Problem ist, dass ich immer "FEHLER #06" bekomme ( => WriteFile gibt FALSE zurück )
Kann das daran liegen, dass kein gerät am com port angeschlossen ist, oder wie oder was???hier mal mein quelltext:
#include <windows.h> #include <iostream.h> WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HANDLE hCom = CreateFile("COM1", GENERIC_WRITE|GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if(!SetupComm(hCom, 512, 512)) { MessageBoxA(NULL, "FEHLER #01", "comPort", NULL); return 0; } DCB dcb; ZeroMemory(&dcb, sizeof(DCB)); char buffer[100]; strcpy(buffer,"baud=1200 parity=N data=8 stop=1"); if (BuildCommDCB((char*)&buffer, &dcb)) { if (dcb.BaudRate != CBR_1200) { MessageBoxA(NULL, "FEHLER #02", "comPort", NULL); return 0; } } else { MessageBoxA(NULL, "FEHLER #03", "comPort", NULL); return 0; } if(GetCommState(hCom, &dcb)) { dcb.BaudRate = CBR_19200; dcb.ByteSize = 8; dcb.Parity = 0; dcb.StopBits = 0; SetCommState(hCom, &dcb); } else { MessageBoxA(NULL, "FEHLER #04", "comPort", NULL); return 0; } if (hCom == INVALID_HANDLE_VALUE) { MessageBoxA(NULL, "FEHLER #05", "comPort", NULL); return 0; } DWORD temp, numbytes_ok; COMSTAT ComState; OVERLAPPED Overlap; char buf_out[1] = "a"; ClearCommError(hCom, &temp, &ComState); ZeroMemory(&Overlap, sizeof(OVERLAPPED)); if(!temp) { if(!WriteFile(hCom, &buf_out, 1, &numbytes_ok, &Overlap)) { MessageBoxA(NULL, "FEHLER #06", "comPort", NULL); return 0; } } DWORD error; error = GetLastError(); if(error) MessageBoxA(NULL, (char *)error, "comPort", NULL); CloseHandle(hCom); MessageBoxA(NULL, "Alles im grünen Bereich!", "comPort", NULL); return 0;
-
Was meint GetLastError() denn, nachdem WriteFile() fehlschlägt ?
-
komisch....
wenn ich es laufen lassen will, dann hängt es -> ich kann nicht herausfinden, was mit lastError sagen will.
das programm stürtzt nur ab, wenn die zeile mit WritFile drin ist.
wenn ich das rauskommentiere, läuft es.
(nur ich kann halt nichts machen...)
-
Den Fehler kann man sich anzeigen lassen (MSDN):
LPVOID lpMsgBuf; FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); // Display the string. MessageBox (NULL, (LPCTSTR)lpMsgBuf, TEXT("Error WriteFile"), MB_OK | MB_ICONINFORMATION); // Free the buffer. LocalFree(lpMsgBuf);Auch solltest Du im Fehlerfalle nicht return 0; ohne CloseHandle (hCom); machen.
Wozu brauchst Du OVERLAPPED Overlap; ?
Setze es auf NULL, wenn Du es nicht benutzt. Bist Du sicher, was Du mit der Abfrage if (!tmp) bezweckst? MSDN: "This parameter can be one or more of the following values. "Blackbird
-
Was mir gerade so auffällt:
char buf_out[1] = "a"; // ... if(!WriteFile(hCom, &buf_out, 1, &numbytes_ok, &Overlap)) <= Ist das "&" vor buf_out da nicht zuviel ?