#include <stdio.h>
#include <windows.h>

HANDLE InitCom1() {
    DCB dcb;
    HANDLE hCom;
    BOOL fSuccess;
    hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (hCom == INVALID_HANDLE_VALUE) {
        MessageBox(0, "Fout: De seriële poort kan niet geopend worden!", "Fout", MB_OK|MB_ICONEXCLAMATION);
        exit(-1);
    }
    fSuccess = GetCommState(hCom, &dcb);
    if (!fSuccess) {
        MessageBox(0, "Fout: De instellingen van de seriële poort kunnen niet gelezen worden!", "Fout", MB_OK|MB_ICONEXCLAMATION);
        exit(-1);
    }
    dcb.fParity = TRUE;
    dcb.BaudRate = CBR_9600;
    dcb.ByteSize = 7;
    dcb.Parity = EVENPARITY;
    dcb.StopBits = ONESTOPBIT;
    dcb.fOutxCtsFlow = FALSE;
    dcb.fOutxDsrFlow = FALSE;
    dcb.fDtrControl = DTR_CONTROL_DISABLE;
    dcb.fDsrSensitivity = FALSE;
    dcb.fOutX = FALSE;
    dcb.fInX = FALSE;
    dcb.fRtsControl = RTS_CONTROL_DISABLE;
    fSuccess = SetCommState(hCom, &dcb);
    if (!fSuccess) {
        MessageBox(0, "Fout: De instellingen van de seriële poort kunnen niet aangepast worden!", "Fout", MB_OK|MB_ICONEXCLAMATION);
        exit(-1);
    }
    return hCom;
}

char ReadCom1(HANDLE hCom) {
    char inBuffer[2]=" ";
    unsigned long nBytesRead;
    ReadFile(hCom, &inBuffer, 1, &nBytesRead, NULL);
    if (nBytesRead!=1) {
        MessageBox(0, "Fout: De seriële poort kan niet uitgelezen worden!", "Fout", MB_OK|MB_ICONEXCLAMATION);
        exit(-1);
    }
    return inBuffer[0];
}

void WriteCom1(HANDLE hCom, char c) {
    char outBuffer[2]=" ";
    unsigned long nBytesWritten;
    outBuffer[0]=c;
    WriteFile(hCom, &outBuffer, 1, &nBytesWritten, NULL);
    if (nBytesWritten!=1) {
        MessageBox(0, "Fout: De seriële poort kan niet beschreven worden!", "Fout", MB_OK|MB_ICONEXCLAMATION);
        exit(-1);
    }
}

int main() {
    HANDLE hCom;
    char in;

    hCom = InitCom1();
    printf("Er wordt nu een S verstuurd.\n");
    WriteCom1(hCom, 'S');
    printf("Ontvangen karakters worden op het scherm gezet totdat een Q wordt ontvangen.\n");
    do {
        in = ReadCom1(hCom);
        if (in!='Q') {
            putchar(in);
        }
    } while (in!='Q');
    CloseHandle(hCom);  //sluiten COM-poort
    printf("\nEINDE.\n");
    getchar();
    return 0;
}
