/* * meins.c * * Created on: 14.07.2008 * Author: Markus */ #include "meiner.h" HANDLE cHand; DCB aDCB; unsigned int uiStateMachine = 0, uilastState, uiLoopVal = 1; int iSetCommState, iGetCommState, iRecCt = 0; unsigned long ulSentData, ulRecData; char cRecText[1000], *pText; DWORD dwGetLerr, dwCommMaske, dwReadStatus; OVERLAPPED aOvLpd; COMMTIMEOUTS aTimeouts; BOOL bSend; int main (void) { pText = cRecText; while (uiLoopVal) { switch (uiStateMachine) { case OPEN_PORT: cHand = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (cHand != INVALID_HANDLE_VALUE) { aOvLpd.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (aOvLpd.hEvent == 0) { uilastState = uiStateMachine; uiStateMachine = MY_ERROR; } else { uiStateMachine = CHECK_PORT; } } else { uilastState = uiStateMachine; uiStateMachine = MY_ERROR; } break; case CHECK_PORT: if(GetCommState (cHand, &aDCB)) { uiStateMachine = SET_PORT; } else { uilastState = uiStateMachine; uiStateMachine = MY_ERROR; } break; case SET_PORT: aDCB.BaudRate = CBR_57600; aDCB.ByteSize = 8; aDCB.Parity = NOPARITY; aDCB.StopBits = 0; aDCB.EvtChar = (char) "\n"; aDCB.DCBlength = (DWORD) sizeof (aDCB); if (SetCommState(cHand, &aDCB)) { uiStateMachine = SET_MASKE; } else { uilastState = uiStateMachine; uiStateMachine = MY_ERROR; } break; case SET_MASKE: if (SetCommMask(cHand, EV_BREAK)) { uiStateMachine = SET_TIMING; } else { uilastState = uiStateMachine; uiStateMachine = MY_ERROR; } break; case SET_TIMING: aTimeouts.ReadIntervalTimeout = MAXDWORD; aTimeouts.ReadTotalTimeoutConstant = 0; aTimeouts.ReadTotalTimeoutMultiplier = 0; aTimeouts.WriteTotalTimeoutConstant = 0; aTimeouts.WriteTotalTimeoutMultiplier = 0; if (SetCommTimeouts (cHand, &aTimeouts)) { uiStateMachine = SEND_DATA; } else { uilastState = uiStateMachine; uiStateMachine = MY_ERROR; } break; case SEND_DATA: WriteFile(cHand,"\n\rHello World over Serial", 26, &ulSentData, &aOvLpd); uiStateMachine = WAIT_FOR_DATA; uilastState = uiStateMachine; uiStateMachine = MY_ERROR; break; case WAIT_FOR_SEND_DONE: if (HasOverlappedIoCompleted (&aOvLpd)) { WaitCommEvent (cHand, &dwCommMaske, &aOvLpd); uiStateMachine = WAIT_FOR_DATA; } break; case WAIT_FOR_DATA: dwReadStatus = WaitForSingleObject (aOvLpd.hEvent, INFINITE); if (dwReadStatus == WAIT_OBJECT_0) { uiStateMachine = READ_DATA; } else if (dwReadStatus == 0xFFFFFFFF) { uilastState = uiStateMachine; uiStateMachine = MY_ERROR; } break; case READ_DATA: if (ReadFile (cHand, pText, sizeof (pText), &ulRecData, &aOvLpd)) { uiStateMachine = PRINT_DATA; } else { uilastState = uiStateMachine; uiStateMachine = MY_ERROR; } break; case PRINT_DATA: printf (pText); uiStateMachine = CLOSE_PORT; break; case CLOSE_PORT: if (CloseHandle(cHand)) { uiLoopVal = 0; } else { uilastState = uiStateMachine; uiStateMachine = MY_ERROR; } break; case MY_ERROR: printf ("Schief gegangen: %i\n%u\n%i", GetLastError (), uilastState, cHand); uiLoopVal = 0; break; default: break; } } return 0; }