⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unitcommset.cpp

📁 BCB串口通讯控件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UnitCommSet.h"
#include "yb_base.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormCommSettings *FormCommSettings;
//---------------------------------------------------------------------------
__fastcall TFormCommSettings::TFormCommSettings(TComponent* Owner, TYbCustomCommDevice *lpCommDevice, bool FActive)
    : TForm(Owner)
{
  Font->Name    = AppLang.FontName;
  Font->Charset = AppLang.Charset;
  Font->Size    = AppLang.FontSize;

  _YbCommDevice = lpCommDevice;
  _ForceActive  = FActive;

  TMsgStrings Msg;
  Caption             = Msg.MsgPortSet  ; //"端口设置"
  GboxBase->Caption   = Msg.StrGbxBase  ; //"端口选项"
  GBoxModem->Caption  = Msg.StrGbxModem ; //"调制解调器选项"
  GBoxBuffer->Caption = Msg.StrGbxBuffer; //"缓存容量"
  BnDefault->Caption  = Msg.MsgDefault  ; //"默认"
  BnOK->Caption       = Msg.MsgOK       ; //"确定"
  BnCancel->Caption   = Msg.MsgCancel   ; //"取消"

  lbPort ->Caption = Msg.MsgPort  ; //"端口"
  lbBaud ->Caption = Msg.MsgBaud  ; //"波特率"
  lbCheck->Caption = Msg.MsgCheck ; //"校验"
  lbBits ->Caption = Msg.MsgBits  ; //"数据位"
  lbStops->Caption = Msg.MsgStops ; //"停止位"
  lbFlow ->Caption = Msg.MsgFlow  ; //"数据流控"
  lbAAns ->Caption = Msg.MsgAAns  ; //"自动应答"
  lbInbs ->Caption = Msg.MsgInBuf ; //"输入缓存"
  lbOutbs->Caption = Msg.MsgOutBuf; //"输出缓存"

  TCommSerialPortInfo spi;
  CbPort->Clear();
  for(int i=0; i<spi.PortList->Count; i++)
    CbPort->Items->Add(spi.PortList->Strings[i]);

  CbParity->Clear();
  CbParity->Items->Add(Msg.MsgNoParity); //"No parity (无)"
  CbParity->Items->Add(Msg.MsgOdd     ); //"Odd (奇)"
  CbParity->Items->Add(Msg.MsgEven    ); //"Even (偶)"
  CbParity->Items->Add(Msg.MsgMark    ); //"Mark (标记)"
  CbParity->Items->Add(Msg.MsgSpacePty); //"Space (空格)"

  CbFlow->Clear();
  CbFlow->Items->Add(Msg.MsgNone   ); //"None (无)"
  CbFlow->Items->Add(Msg.MsgRtsCts ); //"RTS/CTS (硬件)"
  CbFlow->Items->Add(Msg.MsgXonXoff); //"Xon/Xoff (软件)"
  CbFlow->Items->Add(Msg.MsgRtsXon ); //"RTS/CTS & Xon/Xoff (硬件和软件)"

  _OldActive      = _YbCommDevice->Active;
  _OldPortNo      = _YbCommDevice->PortNo;
  _OldBaud        = _YbCommDevice->Baud;
  _OldByteSize    = _YbCommDevice->ByteSize;
  _OldParity      = _YbCommDevice->Parity;
  _OldStopBits    = _YbCommDevice->StopBits;
  _OldFlowControl = _YbCommDevice->FlowControl;
  _OldAutoAAns    = _YbCommDevice->AutoAnswer;
  _OldInBufSize   = _YbCommDevice->InBufSize;
  _OldOutBufSize  = _YbCommDevice->OutBufSize;

  CbPort->ItemIndex = CbPort->Items->IndexOf(TCommSerialPortInfo::PortName(_OldPortNo));

  switch(_OldBaud)
   {
     case TYbCommDevice::br110   : CbSelBaud->ItemIndex =  0; break;
     case TYbCommDevice::br300   : CbSelBaud->ItemIndex =  1; break;
     case TYbCommDevice::br600   : CbSelBaud->ItemIndex =  2; break;
     case TYbCommDevice::br1200  : CbSelBaud->ItemIndex =  3; break;
     case TYbCommDevice::br2400  : CbSelBaud->ItemIndex =  4; break;
     case TYbCommDevice::br4800  : CbSelBaud->ItemIndex =  5; break;
     case TYbCommDevice::br9600  : CbSelBaud->ItemIndex =  6; break;
     case TYbCommDevice::br14400 : CbSelBaud->ItemIndex =  7; break;
     case TYbCommDevice::br19200 : CbSelBaud->ItemIndex =  8; break;
     case TYbCommDevice::br38400 : CbSelBaud->ItemIndex =  9; break;
     case TYbCommDevice::br56000 : CbSelBaud->ItemIndex = 10; break;
     case TYbCommDevice::br57600 : CbSelBaud->ItemIndex = 11; break;
     case TYbCommDevice::br115200: CbSelBaud->ItemIndex = 12; break;
     case TYbCommDevice::br128000: CbSelBaud->ItemIndex = 13; break;
     case TYbCommDevice::br256000: CbSelBaud->ItemIndex = 14; break; 
   }

  CbByteSize->ItemIndex = _OldByteSize-5;

  switch(_OldParity)
   {
     case TYbCommDevice::ptNoParity   : CbParity->ItemIndex = 0; break;
     case TYbCommDevice::ptOddParity  : CbParity->ItemIndex = 1; break;
     case TYbCommDevice::ptEvenParity : CbParity->ItemIndex = 2; break;
     case TYbCommDevice::ptMarkParity : CbParity->ItemIndex = 3; break;
     case TYbCommDevice::ptSpaceParity: CbParity->ItemIndex = 4; break;
     default                          : CbParity->ItemIndex =-1; break;
   }

  switch(_OldStopBits)
   {
     case TYbCommDevice::sbOneStopBit    : CbStopBits->ItemIndex = 0; break;
     case TYbCommDevice::sbOne_5_StopBits: CbStopBits->ItemIndex = 1; break;
     case TYbCommDevice::sbTwoStopBit    : CbStopBits->ItemIndex = 2; break;
     default                             : CbStopBits->ItemIndex =-1; break;
   }

  switch(_OldFlowControl)
   {
     case TYbCommDevice::fcRtsCts:        CbFlow->ItemIndex = 1; break; //Rts/Cts
     case TYbCommDevice::fcXonXoff:       CbFlow->ItemIndex = 2; break; //Xon/Xoff
     case TYbCommDevice::fcTranXonXoff:   CbFlow->ItemIndex = 2; break; //Xon/Xoff
     case TYbCommDevice::fcRtsCtsXonXoff: CbFlow->ItemIndex = 3; break; //Both
     default:                             CbFlow->ItemIndex = 0; break; //None
   }

  EditAutoAns->Text = (int)_OldAutoAAns;
  EditInBufSize->Text = _OldInBufSize;
  EditOutBufSize->Text = _OldOutBufSize;
}
//---------------------------------------------------------------------------
void __fastcall TFormCommSettings::BnDefaultClick(TObject *Sender)
{
  CbSelBaud->ItemIndex  = 12;   //TYbCommDevice::br115200;
  CbParity->ItemIndex   = 0;    //TYbCommDevice::ptNoParity;
  CbByteSize->ItemIndex = 8 - 5;
  CbStopBits->ItemIndex = 0;    //TYbCommDevice::sbOneStopBit;
  CbFlow->ItemIndex     = 0;    //TYbCommDevice::fcNone;
  EditAutoAns->Text     = 0;    //No Auto Answer
  EditInBufSize->Text   = 8192; //8kbytes
  EditOutBufSize->Text  = 8192; //8kbytes
}
//---------------------------------------------------------------------------
void __fastcall TFormCommSettings::BnOKClick(TObject *Sender)
{
  if(MoveCtrlFocus())
    return; //move focus

  int  NewPortNo, NewByteSize, NewAutoAAns;
  long NewInBufSize, NewOutBufSize;
  TYbCommDevice::TBaudRate NewBaud;
  TYbCommDevice::TParity    NewParity;
  TYbCommDevice::TStopBits   NewStopBits;
  TYbCommDevice::TFlowControl NewFlowControl;
  AnsiString s;
  TMsgStrings Msg;

  //选择端口
  if(CbPort->ItemIndex<0)
   {
     CbPort->SetFocus(); //"必须选择端口"
     Application->MessageBox(Msg.ErrSelPort.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP);
     return;
   }
  NewPortNo = TCommSerialPortInfo::PortNo(CbPort->Items->Strings[CbPort->ItemIndex]);

  //设置波特率
  switch(CbSelBaud->ItemIndex)
   {
     case  0: NewBaud = TYbCommDevice::br110   ; break;
     case  1: NewBaud = TYbCommDevice::br300   ; break;
     case  2: NewBaud = TYbCommDevice::br600   ; break;
     case  3: NewBaud = TYbCommDevice::br1200  ; break;
     case  4: NewBaud = TYbCommDevice::br2400  ; break;
     case  5: NewBaud = TYbCommDevice::br4800  ; break;
     case  6: NewBaud = TYbCommDevice::br9600  ; break;
     case  7: NewBaud = TYbCommDevice::br14400 ; break;
     case  8: NewBaud = TYbCommDevice::br19200 ; break;
     case  9: NewBaud = TYbCommDevice::br38400 ; break;
     case 10: NewBaud = TYbCommDevice::br56000 ; break;
     case 11: NewBaud = TYbCommDevice::br57600 ; break;
     case 12: NewBaud = TYbCommDevice::br115200; break;
     case 13: NewBaud = TYbCommDevice::br128000; break;
     case 14: NewBaud = TYbCommDevice::br256000; break;
     default: CbSelBaud->SetFocus(); //"必须输入/选择波特率"
              Application->MessageBox(Msg.ErrSelBaud.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP);
              return;
   }

  //数据位数
  if(CbByteSize->ItemIndex<0)
   {
     CbByteSize->SetFocus(); //"必须选择数据位"
     Application->MessageBox(Msg.ErrSelBits.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP);
     return;
   }
  NewByteSize = CbByteSize->ItemIndex+5;

  //校验位
  switch(CbParity->ItemIndex)
   {
     case  0: NewParity = TYbCommDevice::ptNoParity   ; break;
     case  1: NewParity = TYbCommDevice::ptOddParity  ; break;
     case  2: NewParity = TYbCommDevice::ptEvenParity ; break;
     case  3: NewParity = TYbCommDevice::ptMarkParity ; break;
     case  4: NewParity = TYbCommDevice::ptSpaceParity; break;
     default: CbParity->SetFocus(); //"必须选择奇偶校验"
              Application->MessageBox(Msg.ErrSelCheck.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP);
              return;
   }

  //停止位
  switch(CbStopBits->ItemIndex)
   {
     case  0: NewStopBits = TYbCommDevice::sbOneStopBit    ; break;
     case  1: NewStopBits = TYbCommDevice::sbOne_5_StopBits; break;
     case  2: NewStopBits = TYbCommDevice::sbTwoStopBit    ; break;
     default: CbStopBits->SetFocus(); //"必须选择停止位"
              Application->MessageBox(Msg.ErrSelStops.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP);
              return;
   }

  //数据流控
  switch(CbFlow->ItemIndex)
   {
     case  0: NewFlowControl = TYbCommDevice::fcNone         ; break;
     case  1: NewFlowControl = TYbCommDevice::fcRtsCts       ; break;
     case  2: NewFlowControl = TYbCommDevice::fcXonXoff      ; break;
     case  3: NewFlowControl = TYbCommDevice::fcRtsCtsXonXoff; break;
     default: CbFlow->SetFocus(); //"必须选择数据流控制"
              Application->MessageBox(Msg.ErrSelFlow.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP);
              return;
   }

  //自动应答
  try
   {
     s = EditAutoAns->Text.Trim();
     if(s.IsEmpty())
       throw Exception(Msg.ErrInvAAns);
     int ians = StrToInt(s);
     if((ians<0)||(ians>255))
       throw Exception(Msg.ErrInvAAns);
     NewAutoAAns = ians;
   }
  catch(Exception &e)
   {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -