DarkWinAPI by Darkleo.com

Com-Port und Treads unter Windows

menu.rc
#include <windows.h>
#include "menu.h"

MeinMenu MENU
{
POPUP "&Port"
{
MENUITEM "&1 COM2 Port Öffnen", IDM_PO
MENUITEM "&2 COM2 Port Schliessen", IDM_PZ
MENUITEM "&3 Beenden", IDM_ENDE
}

POPUP "&Options"
{
MENUITEM "&1 Baudrate 4", IDM_OA
MENUITEM "&2 Baudrate *2", IDM_OB
MENUITEM "&3 Baudrate Zufall 2..50", IDM_OC
}

POPUP "&Send"
{
MENUITEM "&1 TAKT AN", IDM_XA
MENUITEM "&2 TAKT AUS", IDM_XB
}

POPUP "&About"
{
MENUITEM "&1 PaulMizel", IDM_INFO
MENUITEM "&2 IS ALL OK?", IDM_IOK
}
}

 

menu.h
//PORT
#define IDM_PO 1 
#define IDM_PZ 2
#define IDM_ENDE 3 

//OPTIONS
#define IDM_OA 21 
#define IDM_OB 22
#define IDM_OC 23

//SEND
#define IDM_XA 11
#define IDM_XB 12

//INFO
#define IDM_INFO 31
#define IDM_IOK 32

 

MenuProgramm.cpp
#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "menu.h"
#include <vcl.h>
#include <time.h>
#include <stdlib.h>

USERC("menu.rc");

LRESULT WINAPI MainWndProc(HWND,UINT,WPARAM, LPARAM );
void WINAPI DCBInit();
void WINAPI IOKF();
DWORD WINAPI ThreadWinMain(LPVOID);
/********************** Globale Variablen ********************/
HANDLE hI;
static TCHAR tcMText[60] = TEXT("RS232 Ampelsteuerungs Programm");
static HANDLE hCom;
static DCB dcb;
BOOL erfolg;
BOOL threadtod;
int randz;
HANDLE Thread;
DWORD CThreadID;
int iBAUD=4;
DWORD BAUD=(DWORD)iBAUD;


int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow )
{
WNDCLASS wc;
MSG msg;
HWND hWnd;
randomize();

hI = hInstance;
wc.lpszClassName = "MeinProgramm";
wc.lpfnWndProc = MainWndProc;
wc.style = CS_OWNDC|CS_VREDRAW|CS_HREDRAW;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = "MeinMenu";
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
RegisterClass( &wc );


hWnd = CreateWindow( "MeinProgramm",
"Paul",
WS_OVERLAPPEDWINDOW,
100,100,400,400,
NULL,
NULL,
hInstance,
NULL
);

ShowWindow(hWnd, nCmdShow );
UpdateWindow(hWnd);

while(GetMessage( &msg, NULL, 0, 0 ) ) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}

return msg.wParam;
}


LRESULT WINAPI MainWndProc( HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam )
{
PAINTSTRUCT ps;
HDC hDC;

switch( msg )
{
/**************************************************************\
* WM_PAINT: *
\**************************************************************/

case WM_PAINT:
hDC = BeginPaint( hWnd, &ps );
TextOut( hDC, 10, 300, tcMText, strlen(tcMText));
EndPaint(hWnd, &ps );
break;
/**************************************************************\
* WM_DESTROY PostQuitMessage() is called *
\**************************************************************/

case WM_DESTROY:
PostQuitMessage( 0 );
break;
/**************************************************************\
* WM_COMMAND *
\**************************************************************/

case WM_COMMAND:
 switch(wParam) { /**********************************************************\
* PORT *
\*************************************************************/

case IDM_PO: //Zeiger auf Com2 erzeugen
 hCom=CreateFile("COM2",
 GENERIC_WRITE,
 FILE_SHARE_READ,
 (LPSECURITY_ATTRIBUTES)NULL,
 OPEN_EXISTING,
 FILE_FLAG_OVERLAPPED,
 NULL);
 if(hCom == (HANDLE)0xFFFFFFFF) //ob fehler aufgetreten sind?
 MessageBox(hWnd,"Schnittstelle Öffnen!!!","Fehler",
 MB_OK|MB_ICONWARNING);
break;
case IDM_PZ: //Port Schliessen
 CloseHandle(hCom);
break;
case IDM_ENDE: //Programm Beenden
 SendMessage(hWnd,WM_CLOSE,NULL,NULL);
break;
/**************************************************************\
* OPTIONS *
\**************************************************************/

case IDM_OA:
 GetCommState(hCom, &dcb);
 DCBInit();
 iBAUD=4;
 DCBInit();
break;
case IDM_OB:
 GetCommState(hCom, &dcb);
 DCBInit();
 iBAUD=iBAUD*2;
 DCBInit();
break;
case IDM_OC:
 GetCommState(hCom, &dcb);
 DCBInit();
 iBAUD=((rand() % 50)+2);
 DCBInit();
break;
/**************************************************************\
* SEND *
\**************************************************************/

case IDM_XA: //Thread Starten
 DWORD MTID;
 Thread=CreateThread(NULL,0,ThreadWinMain,(LPVOID)10,0,&MTID);
 threadtod =1;
break;
case IDM_XB: //Thread Beenden
 CloseHandle(Thread);
 threadtod =0;
break;
/**************************************************************\
* PROGRAMM INFO
\**************************************************************/

case IDM_INFO://About
 MessageBox(hWnd,
 "Info\n\n\
 RS232 Ampelsteuerungs Programm\n\n\
 Name Paul Mizel\n\
 Klasse ITA-OC"
,"Info zu PaulMizel",
 MB_OK|MB_ICONSTOP);
break;
case IDM_IOK://Zeigt ob etwas falsch ist
 IOKF();
break;
}
break;/*End wm_command */
/**************************************************************\
* MSG WEITER schicken
\**************************************************************/

default:
return( DefWindowProc( hWnd, msg, wParam, lParam ));
}
return 0;
}


DWORD WINAPI ThreadWinMain(LPVOID)
{
for(;;)
{
TransmitCommChar(hCom,(char)0x55);//  stbit1 0x55=01010101 ->
if(threadtod==0)
return 0;
}
}

/**************************************************************\
* DCBinit()
\**************************************************************/

void WINAPI DCBInit()
{
BAUD=(DWORD)iBAUD;
dcb.BaudRate = BAUD; 
dcb.ByteSize=8; 
dcb.Parity=0; 
dcb.StopBits=0; 
erfolg=SetCommState(hCom, &dcb);
}


void WINAPI IOKF()
{
if(hCom == (HANDLE)0xFFFFFFFF)
MessageBox(NULL,"COM2 Verbindungs Fehler!","Fehler",
MB_OK|MB_ICONWARNING);
else if(erfolg==0)
MessageBox(NULL,"DCB Fehler\n\n\
Vorgehensweise\n\
1.Port 1. Com2 Port Öffnen\n\
2.Options 1..3 Baudrate\n\
3.Send 1 SENDEN AN\n\n\
Das sind die 3.Schritte."
,"Fehler",MB_OK|MB_ICONWARNING);
else
MessageBox(NULL,"Alles OK!","Es Leuft", MB_OK|MB_ICONWARNING);
}

Projekt Downloaden hier