Задача
Открыть COM-порт средствами WinAPI и передать в него строку.
Компоненты на форме
Edit (EditPort, EditTx), Button (ButtonOpen, ButtonSend), StatusBar.
Как работает
- Разобрать имя порта («COM12») в номер.
- Открыть устройство функцией CreateFile.
- Передавать строку через WriteFile.
Исходный код модуля
//---------------------------------------------------------------------------
// Проект 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);
}
//---------------------------------------------------------------------------
Пояснения
- Для портов выше COM9 нужен префикс \\.\ в имени.
- Ядро parseComName проверено тестом.
- Полноценный приём делается отдельным потоком или таймером.
📦 help-user.ru — срочный ремонт компьютеров и восстановление данных в Москве: help-user.ru.
Что дальше
Создайте в C++Builder новый проект, разместите перечисленные компоненты и вставьте код модуля. Остальные 49 программ — в разделе проектов на C++Builder; смотрите также обзор среды и контроллеры AVR.