-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathADCPort.cpp
More file actions
82 lines (77 loc) · 3.36 KB
/
ADCPort.cpp
File metadata and controls
82 lines (77 loc) · 3.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// ---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ADCPort.h"
#include "ADCBoard.h"
#include <iostream.h>
#include <string.h>
#pragma package(smart_init)
// ---------------------------------------------------------------------------
extern unsigned char bufwr[3];
extern HANDLE ADC_Com_Handle;
extern HANDLE Read;
extern HANDLE hEvent;
extern OVERLAPPED over;
extern OVERLAPPED overlappedwr;
extern unsigned int bytes_to_receive;
extern volatile unsigned int bytes;
extern unsigned char *buffer;
// ---------------------------------------------------------------------------
DWORD WINAPI ReadPort(LPVOID) {
// ---- Place thread code here ----
COMSTAT curstat = {0};
DWORD btr, temp, mask, signal, result; // temp - переменная-заглушка
// очистить приемный буфер COM-порта
PurgeComm(ADC_Com_Handle, PURGE_RXCLEAR);
// создать событие для приема; true,true - для асинхронных операций
over.hEvent = CreateEvent(NULL, true, true, NULL);
// создать событие
overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL);
// маска = если принят байт
SetCommMask(ADC_Com_Handle, EV_RXCHAR);
while (1) {
// послать байты
// записать байты в порт (перекрываемая операция!)
WriteFile(ADC_Com_Handle, (void*)bufwr, 3, &temp, &overlappedwr);
// приостановить поток, пока не завершится перекрываемая операция WriteFile
signal = WaitForSingleObject(overlappedwr.hEvent, INFINITE);
// если операция завершилась успешно, установить соответствующий флажок
if ((signal == WAIT_OBJECT_0) && (GetOverlappedResult(ADC_Com_Handle,
&overlappedwr, &temp, true))) {
bytes = 0;
signal = WAIT_OBJECT_0;
while (signal == WAIT_OBJECT_0) {
// усыпить поток до прихода байта
signal = WaitForSingleObject(over.hEvent, 300);
// если событие прихода байта произошло
if (signal == WAIT_OBJECT_0) {
// получить количество принятых байтов
ClearCommError(ADC_Com_Handle, &temp, &curstat);
btr = curstat.cbInQue;
// если все байты приняты
if (btr == bytes_to_receive) {
bytes = bytes_to_receive;
// прочитать байты из порта в буфер программы
ReadFile(ADC_Com_Handle, buffer, bytes, &temp, &over);
// все байты приняты - выйти из цикла
break;
}
else
// ожидать приема нового байта
result = WaitCommEvent(ADC_Com_Handle, &mask,
&over);
}
}
}
// установить событие в сигнальное состояние
SetEvent(hEvent);
// приостановить поток
SuspendThread(Read);
}
// перед выходом из потока закрыть объект-событие
CloseHandle(overlappedwr.hEvent);
CloseHandle(over.hEvent);
// выйти из потока
ExitThread(0);
}
// ---------------------------------------------------------------------------