349 lines
6.8 KiB
C
349 lines
6.8 KiB
C
#include <stddef.h>
|
||
#include <string.h>
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include "windows.h"
|
||
|
||
HANDLE WaitEvent;
|
||
HANDLE ReadEvent;
|
||
HANDLE hFile;
|
||
HANDLE IoSemaphore;
|
||
|
||
|
||
DWORD
|
||
WaitCommThread(
|
||
LPVOID Trash
|
||
)
|
||
{
|
||
|
||
DWORD ReasonSatisfied;
|
||
DWORD Trash2;
|
||
OVERLAPPED Ol;
|
||
UNREFERENCED_PARAMETER(Trash);
|
||
|
||
Ol.hEvent = WaitEvent;
|
||
do {
|
||
|
||
if (!WaitCommEvent(
|
||
hFile,
|
||
&ReasonSatisfied,
|
||
&Ol
|
||
)) {
|
||
|
||
DWORD LastError = GetLastError();
|
||
|
||
if (LastError == ERROR_IO_PENDING) {
|
||
|
||
if (!GetOverlappedResult(
|
||
hFile,
|
||
&Ol,
|
||
&Trash2,
|
||
TRUE
|
||
)) {
|
||
|
||
WaitForSingleObject(IoSemaphore,-1);
|
||
printf("Could not do the getoverlapped on the wait: %d\n",GetLastError());
|
||
ReleaseSemaphore(IoSemaphore,1,NULL);
|
||
|
||
}
|
||
|
||
} else {
|
||
|
||
WaitForSingleObject(IoSemaphore,-1);
|
||
printf("Could not start the wait: %d\n",LastError);
|
||
ReleaseSemaphore(IoSemaphore,1,NULL);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
} while (TRUE);
|
||
|
||
return 1;
|
||
|
||
}
|
||
|
||
DWORD
|
||
SetMaskThread(
|
||
LPVOID Trash
|
||
)
|
||
{
|
||
|
||
|
||
UNREFERENCED_PARAMETER(Trash);
|
||
|
||
do {
|
||
|
||
//
|
||
// Now clear.
|
||
//
|
||
|
||
Sleep(1000);
|
||
if (!SetCommMask(
|
||
hFile,
|
||
0
|
||
)) {
|
||
|
||
DWORD LastError = GetLastError();
|
||
|
||
WaitForSingleObject(IoSemaphore,-1);
|
||
printf("Could not initiate the 0 set mask: %d\n",LastError);
|
||
ReleaseSemaphore(IoSemaphore,1,NULL);
|
||
|
||
}
|
||
|
||
//
|
||
// Now set.
|
||
//
|
||
|
||
Sleep(1000);
|
||
if (!SetCommMask(
|
||
hFile,
|
||
EV_RXCHAR
|
||
)) {
|
||
|
||
DWORD LastError = GetLastError();
|
||
|
||
WaitForSingleObject(IoSemaphore,-1);
|
||
printf("Could not initiate the EV_RXCHAR set mask: %d\n",LastError);
|
||
ReleaseSemaphore(IoSemaphore,1,NULL);
|
||
|
||
|
||
}
|
||
|
||
} while (TRUE);
|
||
|
||
return 1;
|
||
|
||
}
|
||
DWORD
|
||
ReadThread(
|
||
LPVOID Trash
|
||
)
|
||
{
|
||
|
||
DWORD Trash2;
|
||
OVERLAPPED Ol;
|
||
char readbuff[100];
|
||
DWORD NumberActuallyRead;
|
||
DWORD NumberToRead = 100;
|
||
|
||
UNREFERENCED_PARAMETER(Trash);
|
||
Ol.hEvent = ReadEvent;
|
||
do {
|
||
|
||
Sleep(200);
|
||
if (!ReadFile(
|
||
hFile,
|
||
readbuff,
|
||
NumberToRead,
|
||
&NumberActuallyRead,
|
||
&Ol
|
||
)) {
|
||
|
||
DWORD LastError = GetLastError();
|
||
|
||
if (LastError == ERROR_IO_PENDING) {
|
||
|
||
if (!GetOverlappedResult(
|
||
hFile,
|
||
&Ol,
|
||
&Trash2,
|
||
TRUE
|
||
)) {
|
||
|
||
WaitForSingleObject(IoSemaphore,-1);
|
||
printf("Could not do the getoverlapped on the read: %d\n",GetLastError());
|
||
ReleaseSemaphore(IoSemaphore,1,NULL);
|
||
|
||
}
|
||
|
||
} else {
|
||
|
||
WaitForSingleObject(IoSemaphore,-1);
|
||
printf("Could not start the wait: %d\n",LastError);
|
||
ReleaseSemaphore(IoSemaphore,1,NULL);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
} while (TRUE);
|
||
|
||
return 1;
|
||
|
||
}
|
||
|
||
int __cdecl main(int argc,char *argv[]) {
|
||
|
||
char *MyPort = "COM1";
|
||
DWORD ValueFromEscape = 0;
|
||
DWORD CharFunc;
|
||
DWORD ThreadId;
|
||
DWORD ReadThreadId;
|
||
HANDLE ReadHandle;
|
||
int scanfval;
|
||
|
||
if (argc > 1) {
|
||
|
||
MyPort = argv[1];
|
||
|
||
}
|
||
|
||
WaitEvent = CreateEvent(
|
||
NULL,
|
||
TRUE,
|
||
FALSE,
|
||
NULL
|
||
);
|
||
|
||
if (!WaitEvent) {
|
||
|
||
printf("Wait Event could not be created\n");
|
||
exit(1);
|
||
|
||
}
|
||
|
||
ReadEvent = CreateEvent(
|
||
NULL,
|
||
TRUE,
|
||
FALSE,
|
||
NULL
|
||
);
|
||
|
||
if (!ReadEvent) {
|
||
|
||
printf("Read Event could not be created\n");
|
||
exit(1);
|
||
|
||
}
|
||
|
||
IoSemaphore = CreateSemaphore(
|
||
NULL,
|
||
1,
|
||
1,
|
||
NULL
|
||
);
|
||
|
||
if (!IoSemaphore) {
|
||
|
||
printf("IoSemaphore could not be created\n");
|
||
exit(1);
|
||
|
||
}
|
||
|
||
if ((hFile = CreateFile(
|
||
MyPort,
|
||
GENERIC_READ | GENERIC_WRITE,
|
||
0,
|
||
NULL,
|
||
CREATE_ALWAYS,
|
||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
||
NULL
|
||
)) != ((HANDLE)-1)) {
|
||
|
||
DCB MyDcb;
|
||
COMMTIMEOUTS NewTimeouts;
|
||
|
||
printf("We successfully opened the %s port.\n",MyPort);
|
||
|
||
|
||
//
|
||
// We've successfully opened the file. Set the state of
|
||
// the comm device. First we get the old values and
|
||
// adjust to our own.
|
||
//
|
||
|
||
if (!GetCommState(
|
||
hFile,
|
||
&MyDcb
|
||
)) {
|
||
|
||
printf("Couldn't get the comm state: %d\n",GetLastError());
|
||
exit(1);
|
||
|
||
}
|
||
|
||
MyDcb.BaudRate = 19200;
|
||
MyDcb.ByteSize = 8;
|
||
MyDcb.Parity = NOPARITY;
|
||
MyDcb.StopBits = ONESTOPBIT;
|
||
MyDcb.EvtChar = 'a';
|
||
|
||
if (!SetCommState(
|
||
hFile,
|
||
&MyDcb
|
||
)) {
|
||
|
||
printf("Couldn't set the comm state: %d\n",GetLastError());
|
||
exit(1);
|
||
|
||
}
|
||
|
||
if (!SetCommTimeouts(
|
||
hFile,
|
||
&NewTimeouts
|
||
)) {
|
||
|
||
printf("Couldn't set the comm timeouts: %d\n",GetLastError());
|
||
exit(1);
|
||
|
||
}
|
||
|
||
} else {
|
||
|
||
printf("Could not open the comm port: %d\n",GetLastError());
|
||
|
||
}
|
||
|
||
//
|
||
// Create the thread that will wait for the
|
||
// comm events.
|
||
//
|
||
|
||
if (!CreateThread(
|
||
NULL,
|
||
0,
|
||
WaitCommThread,
|
||
NULL,
|
||
0,
|
||
&ThreadId
|
||
)) {
|
||
|
||
printf("Could not create the wait thread.\n");
|
||
exit(1);
|
||
|
||
}
|
||
|
||
if (!CreateThread(
|
||
NULL,
|
||
0,
|
||
SetMaskThread,
|
||
NULL,
|
||
0,
|
||
&ThreadId
|
||
)) {
|
||
|
||
printf("Could not create the set mask thread.\n");
|
||
exit(1);
|
||
|
||
}
|
||
|
||
if ((ReadHandle = CreateThread(
|
||
NULL,
|
||
0,
|
||
ReadThread,
|
||
NULL,
|
||
0,
|
||
&ThreadId
|
||
)) == 0) {
|
||
|
||
printf("Could not create the read thread.\n");
|
||
exit(1);
|
||
|
||
}
|
||
|
||
WaitForSingleObject(ReadHandle,-1);
|
||
|
||
}
|