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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
| /---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <inifiles.hpp>
#include "Umain.h"
#include "UPort.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TPMain *PMain;
extern TCommTimeouts lpCommTimeouts;
extern HANDLE port;
extern TDCB lpDCB;
extern TOverlapped Overlapp ;
extern AnsiString buf;
extern char buf1[255];
extern AnsiString COM_name;
extern int COM_BaudRate;
extern int COM_ByteSize;
extern int COM_Parity;
extern int COM_StopBits;
extern int COM_RITimeout;
extern int COM_RTTConstant;
extern int COM_RTTMultiplier;
extern int COM_WTTMultiplier;
extern int COM_WTTConstant;
//---------------------------------------------------------------------------
__fastcall TPMain::TPMain(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TPMain::Open_COM_portClick(TObject *Sender)
{
if (port != 0)
{
CloseHandle(port);
port = 0;
}
Overlapp.hEvent = 0;
Overlapp.Internal = 0;
Overlapp.InternalHigh = 0;
Overlapp.Offset = 0;
Overlapp.OffsetHigh = 0;
TIniFile* ini;
ini = new TIniFile(ExtractFilePath(Application->ExeName)+"config.ini");
COM_name = ini -> ReadString("XK3118T1","COM","COM1");
COM_BaudRate = ini -> ReadInteger("XK3118T1","BaudRate",9600);
COM_ByteSize = ini -> ReadInteger("XK3118T1","ByteSize",8);
COM_Parity = ini -> ReadInteger("XK3118T1","Parity",0);
COM_StopBits = ini -> ReadInteger("XK3118T1","StopBits",0);
COM_RITimeout = ini -> ReadInteger("XK3118T1","ReadIntervalTimeout",10);
COM_RTTConstant = ini -> ReadInteger("XK3118T1","ReadTotalTimeoutConstant",0);
COM_RTTMultiplier = ini -> ReadInteger("XK3118T1","ReadTotalTimeoutMultiplier",0);
COM_WTTMultiplier = ini -> ReadInteger("XK3118T1","WriteTotalTimeoutMultiplier",0);
COM_WTTConstant = ini -> ReadInteger("XK3118T1","WriteTotalTimeoutConstant",500);
delete ini;
if (port == 0)
port = CreateFile(COM_name.c_str(),
GENERIC_READ | GENERIC_WRITE, 0,
NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, 0);
// ÷òåíèå â lpDCB ïàðàìåòðîâ ïîðòà
if(! GetCommState(port, &lpDCB))
{
AnsiString S = "Íå óäàëîñü îòêðûòü ïîðò " + COM_name;
ShowMessage(S.c_str());
exit;
}
// íàñòðîéêà ïàðàìåòðîâ â çàïèñè lpDC
lpDCB.BaudRate = COM_BaudRate;
lpDCB.ByteSize = COM_ByteSize;
lpDCB.Parity = COM_Parity;
lpDCB.StopBits = COM_StopBits;
lpDCB.fBinary = TRUE; //âêëþ÷àåì äâîè÷íûé ðåæèì îáìåíà
lpDCB.fOutxCtsFlow = FALSE; //âûêëþ÷àåì ðåæèì ñëåæåíèÿ çà ñèãíàëîìCTS
lpDCB.fOutxDsrFlow = FALSE; //âûêëþ÷àåì ðåæèì ñëåæåíèÿ çà ñèãíàëîìDSR
lpDCB.fDtrControl = DTR_CONTROL_DISABLE; //îòêëþ÷àåì èñïîëüçîâàíèå ëèíèèDTR
lpDCB.fDsrSensitivity = FALSE; //îòêëþ÷àåì âîñïðèèì÷èâîñòü äðàéâåðà ê ñîñòîÿíèþ ëèíèèDSR
lpDCB.fNull = FALSE; //ðàçðåøèòü ïðè¸ì íóëåâûõ áàéòîâ
lpDCB.fRtsControl = RTS_CONTROL_DISABLE; //îòêëþ÷àåì èñïîëüçîâàíèå ëèíèèRTS
lpDCB.fAbortOnError = FALSE; //îòêëþ÷àåì îñòàíîâêó âñåõ îïåðàöèé
// çàïèñü ïàðàìåòðîâ â ïîðò
if(!SetCommState(port, &lpDCB))
{
ShowMessage("Çíà÷åíèÿ ïàðàìåòðîâ íåäîïóñòèìûå\n"
"Óñòàíîâêà íå ïðîèçâåäåíà");
}
try
{
lpCommTimeouts.ReadIntervalTimeout = COM_RITimeout;
lpCommTimeouts.ReadTotalTimeoutMultiplier = COM_RTTConstant;
lpCommTimeouts.ReadTotalTimeoutConstant = COM_RTTMultiplier;
lpCommTimeouts.WriteTotalTimeoutMultiplier = COM_WTTMultiplier;
lpCommTimeouts.WriteTotalTimeoutConstant = COM_WTTConstant;
}
catch(EConvertError&)
{
ShowMessage("Îøèáî÷íîå çíà÷åíèå âðåìåííîãî èíòåðâàëà.\n Óñòàíîâêà íå ïðîèçâåäåíà");
exit;
}
if (!SetCommTimeouts(port, &lpCommTimeouts))
{
ShowMessage("Çíà÷åíèÿ âðåìåííûõ ïàðàìåòðîâ íåäîïóñòèìûå\n Óñòàíîâêà íå ïðîèçâåäåíà");
exit;
}
Label1->Caption = "Ïîðò îòêðûò";
//óñòàíîâèòü ðàçìåðû î÷åðåäåé ïðè¸ìà è ïåðåäà÷è
}
//---------------------------------------------------------------------------
void __fastcall TPMain::Read_COMClick(TObject *Sender)
{
// ïðîöåäóðà ÷òåíèÿ
Memo1->Lines->Add(buf1);
int n;
strcpy(buf1, "");
FlushFileBuffers(port);
// Overlapp.hEvent = CreateEvent(NULL, false, false, NULL);
ReadFile(port, buf1, 100, &DWORD(n), &Overlapp);
if (GetLastError() != ERROR_IO_PENDING)
ShowMessage("Îøèáêà ÷òåíèÿ äàííûõ");
else
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TPMain::Timer1Timer(TObject *Sender)
{
int n;
if (GetOverlappedResult(port, &Overlapp, &DWORD(n), false))
{
Label1->Caption = "Ïîëó÷åíû/ïåðåäàíû íîâûå äàííûå - " + IntToStr(n) + " áàéò";
Timer1->Enabled = false;
}
else Label1->Caption = "Íîâûõ äàííûõ íåò";
}
//--------------------------------------------------------------------------- |