AFON//Радиотехник
C++Builder · проект 41/50

Терминал COM-порта

Открытие порта WinAPI, приём и передача.

Задача

Открыть COM-порт средствами WinAPI и передать в него строку.

Компоненты на форме

Edit (EditPort, EditTx), Button (ButtonOpen, ButtonSend), StatusBar.

Как работает

  1. Разобрать имя порта («COM12») в номер.
  2. Открыть устройство функцией CreateFile.
  3. Передавать строку через 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.