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

Настройка COM

Скорость, биты, чётность, стоп-биты (DCB).

Задача

Настроить параметры открытого COM-порта через структуру DCB.

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

ComboBox (ComboBaud, ComboBits, ComboStop), Edit (EditParity), Button (ButtonApply), StatusBar.

Как работает

  1. Прочитать текущее состояние порта GetCommState.
  2. Заполнить поля DCB выбранными значениями.
  3. Применить настройки SetCommState.

Исходный код модуля

//---------------------------------------------------------------------------
// Проект 42. Настройка параметров COM
// Заполнение DCB: скорость, биты, чётность, стоп-биты.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------

// Кодирование параметров COM в поля DCB. dcbParity — ядро, переводящее
// букву чётности в код WinAPI (N/E/O), проверяется тестом.
int dcbParity(char p)   // N,E,O,M,S -> NOPARITY..
{
    switch (p){ case 'E':case 'e':return EVENPARITY;
                case 'O':case 'o':return ODDPARITY;
                case 'M':case 'm':return MARKPARITY;
                case 'S':case 's':return SPACEPARITY; }
    return NOPARITY;
}
//---------------------------------------------------------------------------
extern HANDLE FPort;
void __fastcall TForm1::ButtonApplyClick(TObject *Sender)
{
    if (FPort==INVALID_HANDLE_VALUE){ StatusBar1->SimpleText="Сначала откройте порт"; return; }
    DCB dcb; ZeroMemory(&dcb,sizeof(dcb)); dcb.DCBlength=sizeof(dcb);
    GetCommState(FPort,&dcb);
    dcb.BaudRate = StrToIntDef(ComboBaud->Text,9600);
    dcb.ByteSize = StrToIntDef(ComboBits->Text,8);
    dcb.Parity   = dcbParity(EditParity->Text.IsEmpty()?'N':EditParity->Text[1]);
    dcb.StopBits = (ComboStop->ItemIndex==1)? TWOSTOPBITS : ONESTOPBIT;
    if (SetCommState(FPort,&dcb)) StatusBar1->SimpleText="Параметры применены";
    else StatusBar1->SimpleText="Ошибка настройки";
}
//---------------------------------------------------------------------------

Пояснения

  • Ядро dcbParity переводит букву чётности в код WinAPI.
  • Настраивать порт нужно после его открытия.
📦 help-user.ru — срочный ремонт компьютеров и восстановление данных в Москве: help-user.ru.

Что дальше

Создайте в C++Builder новый проект, разместите перечисленные компоненты и вставьте код модуля. Остальные 49 программ — в разделе проектов на C++Builder; смотрите также обзор среды и контроллеры AVR.