1 | #define WIN32_LEAN_AND_MEAN
|
2 | #include <windows.h>
|
3 | #include <stdio.h>
|
4 |
|
5 | HANDLE hCom = INVALID_HANDLE_VALUE;
|
6 | DCB dcb = {sizeof(DCB)};
|
7 | DCB dcb_check;
|
8 | COMMTIMEOUTS to = {0}; // Disable all timeouts
|
9 | COMMTIMEOUTS to_check;
|
10 | DWORD dwEaten;
|
11 | FILE *stream;
|
12 |
|
13 | #define PRINTF_DCB_MEMBER(member) fprintf(stream, "%20s: %d\n", #member, dcb.member)
|
14 | #define COM_PORT "COM1"
|
15 | #define USE_LOG_FILE 1
|
16 |
|
17 | const char strTest[] = "Testing COM port...";
|
18 | char inBuf[MAX_PATH];
|
19 |
|
20 | void check_err(int ok)
|
21 | {
|
22 | if(!ok)
|
23 | {
|
24 | fprintf(stream, "Error!\n\n\n");
|
25 | if(hCom != INVALID_HANDLE_VALUE) CloseHandle(hCom);
|
26 | if(stream != stdout) fclose(stream);
|
27 | abort();
|
28 | }
|
29 | else
|
30 | {
|
31 | fprintf(stream, "ok\n");
|
32 | }
|
33 | }
|
34 |
|
35 | int main(int argc, char *args[])
|
36 | {
|
37 | stream = stdout;
|
38 |
|
39 | #if(USE_LOG_FILE)
|
40 | stream = fopen("E:\\xp_com_test\\log.txt","w");
|
41 | if(!stream)
|
42 | {
|
43 | printf("Could not create log file!\n");
|
44 | abort();
|
45 | }
|
46 | #endif
|
47 |
|
48 | fprintf(stream, "Opening COM Port "COM_PORT":...");
|
49 | hCom = CreateFile( COM_PORT,
|
50 | GENERIC_READ | GENERIC_WRITE, 0,
|
51 | 0, OPEN_EXISTING,
|
52 | 0, NULL);
|
53 |
|
54 | check_err(hCom != INVALID_HANDLE_VALUE);
|
55 |
|
56 | fprintf(stream, "GetCommState()...");
|
57 | check_err(GetCommState(hCom, &dcb));
|
58 |
|
59 | dcb.BaudRate = 9600;
|
60 | dcb.ByteSize = 8;
|
61 | dcb.StopBits = ONESTOPBIT;
|
62 | dcb.Parity = NOPARITY;
|
63 | dcb.fParity = (dcb.Parity != NOPARITY);
|
64 |
|
65 | // No flow control by default
|
66 | dcb.fOutxCtsFlow=0;
|
67 | dcb.fOutxDsrFlow=0;
|
68 | dcb.fDsrSensitivity=0;
|
69 |
|
70 | dcb.fRtsControl=RTS_CONTROL_DISABLE;
|
71 | dcb.fDtrControl=DTR_CONTROL_DISABLE;
|
72 |
|
73 | dcb.fOutX=0;
|
74 | dcb.fInX=0;
|
75 |
|
76 | fprintf(stream, "SetCommState()...");
|
77 | check_err(SetCommState(hCom, &dcb));
|
78 |
|
79 | fprintf(stream, "GetCommState() for verifying...");
|
80 | check_err(GetCommState(hCom, &dcb_check));
|
81 |
|
82 | fprintf(stream, "Verify DCB parameters...");
|
83 | check_err(!memcmp(&dcb, &dcb_check, sizeof(DCB)));
|
84 |
|
85 | fprintf(stream, "\nDCB members:\n");
|
86 | PRINTF_DCB_MEMBER(BaudRate);
|
87 | PRINTF_DCB_MEMBER(fBinary);
|
88 | PRINTF_DCB_MEMBER(fParity);
|
89 | PRINTF_DCB_MEMBER(fOutxCtsFlow);
|
90 | PRINTF_DCB_MEMBER(fOutxDsrFlow);
|
91 | PRINTF_DCB_MEMBER(fDtrControl);
|
92 | PRINTF_DCB_MEMBER(fDsrSensitivity);
|
93 | PRINTF_DCB_MEMBER(fTXContinueOnXoff);
|
94 | PRINTF_DCB_MEMBER(fOutX);
|
95 | PRINTF_DCB_MEMBER(fInX);
|
96 | PRINTF_DCB_MEMBER(fErrorChar);
|
97 | PRINTF_DCB_MEMBER(fNull);
|
98 | PRINTF_DCB_MEMBER(fRtsControl);
|
99 | PRINTF_DCB_MEMBER(fAbortOnError);
|
100 | PRINTF_DCB_MEMBER(XonLim);
|
101 | PRINTF_DCB_MEMBER(XoffLim);
|
102 | PRINTF_DCB_MEMBER(ByteSize);
|
103 | PRINTF_DCB_MEMBER(Parity);
|
104 | PRINTF_DCB_MEMBER(StopBits);
|
105 | PRINTF_DCB_MEMBER(XonChar);
|
106 | PRINTF_DCB_MEMBER(XoffChar);
|
107 | PRINTF_DCB_MEMBER(ErrorChar);
|
108 | PRINTF_DCB_MEMBER(EofChar);
|
109 | PRINTF_DCB_MEMBER(EvtChar);
|
110 | fprintf(stream, "\n");
|
111 |
|
112 | fprintf(stream, "Set timeouts...");
|
113 | to.ReadTotalTimeoutConstant = 500; // Waits 0,5 sec before timout occures
|
114 | check_err(SetCommTimeouts(hCom, &to));
|
115 |
|
116 | fprintf(stream, "GetCommTimeouts() for verifying...");
|
117 | check_err(GetCommTimeouts(hCom, &to_check));
|
118 |
|
119 | fprintf(stream, "Verify timeout paramters...");
|
120 | check_err(!memcmp(&to, &to_check, sizeof(COMMTIMEOUTS)));
|
121 |
|
122 | fprintf(stream, "Write test string...");
|
123 | check_err(WriteFile(hCom, strTest, strlen(strTest), &dwEaten, (LPOVERLAPPED)NULL));
|
124 |
|
125 | fprintf(stream, "All characters written? ...");
|
126 | check_err(dwEaten == strlen(strTest));
|
127 |
|
128 | fprintf(stream, "Reading COM port...");
|
129 | check_err(ReadFile(hCom, inBuf, sizeof inBuf, &dwEaten, (LPOVERLAPPED)NULL) && dwEaten>0);
|
130 |
|
131 | fprintf(stream, "Read from COM port: \"%*s\"", dwEaten, inBuf);
|
132 |
|
133 | fprintf(stream, "\n\nDone!\n\n");
|
134 |
|
135 |
|
136 | CloseHandle(hCom);
|
137 | if(stream != stdout) fclose(stream);
|
138 | return 0;
|
139 | }
|