//---------------------------------------------------------------------------
// Проект 41. Терминал COM-порта
// Открытие порта через WinAPI, приём и передача строки.
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------

// Открытие COM-порта средствами WinAPI (CreateFile). Здесь — каркас
// приёма/передачи; ядро parseComName разбирает "COM12" в номер.
int parseComName(const AnsiString &s)
{
    AnsiString t=s.UpperCase().Trim();
    if (t.SubString(1,3)!="COM") return -1;
    return StrToIntDef(t.SubString(4,t.Length()), -1);
}
//---------------------------------------------------------------------------
HANDLE FPort=INVALID_HANDLE_VALUE;
void __fastcall TForm1::ButtonOpenClick(TObject *Sender)
{
    int num=parseComName(EditPort->Text);
    if (num<0){ StatusBar1->SimpleText="Неверное имя порта"; return; }
    AnsiString dev = "\\.\COM" + IntToStr(num);
    FPort = CreateFile(dev.c_str(), GENERIC_READ|GENERIC_WRITE, 0, NULL,
                       OPEN_EXISTING, 0, NULL);
    StatusBar1->SimpleText = (FPort==INVALID_HANDLE_VALUE)? "Не удалось открыть" : "Порт открыт";
}
void __fastcall TForm1::ButtonSendClick(TObject *Sender)
{
    if (FPort==INVALID_HANDLE_VALUE) return;
    AnsiString s=EditTx->Text; DWORD wr;
    WriteFile(FPort, s.c_str(), s.Length(), &wr, NULL);
    StatusBar1->SimpleText="Отправлено байт: "+IntToStr((int)wr);
}
//---------------------------------------------------------------------------
