www.pudn.com > CommSettings.rar > UnitCommSet.cpp
//--------------------------------------------------------------------------- #include#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 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 (标记)" 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; 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; 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) { EditAutoAns->SetFocus(); Application->MessageBox(Msg.ErrInvAAns.c_str(),Caption.c_str(),MB_OK|MB_ICONSTOP); return; } //输入缓存 try { s = EditInBufSize->Text.Trim(); if(s.IsEmpty()) throw Exception(Msg.ErrInvInBuf); NewInBufSize = StrToInt(s); if(NewInBufSize<4096) throw Exception(Msg.ErrInvInBuf); } catch(Exception &e) { EditInBufSize->SetFocus(); Application->MessageBox(Msg.ErrInvInBuf.c_str(),Caption.c_str(),MB_OK|MB_ICONSTOP); return; } //输出缓存 try { s = EditOutBufSize->Text.Trim(); if(s.IsEmpty()) throw Exception(Msg.ErrInvOutBuf); NewOutBufSize = StrToInt(s); if(NewOutBufSize<4096) throw Exception(Msg.ErrInvOutBuf); } catch(Exception &e) { EditOutBufSize->SetFocus(); Application->MessageBox(Msg.ErrInvOutBuf.c_str(),Caption.c_str(),MB_OK|MB_ICONSTOP); return; } //设置参数 try { _YbCommDevice->PortNo = NewPortNo; _YbCommDevice->Baud = NewBaud; _YbCommDevice->Parity = NewParity; _YbCommDevice->ByteSize = NewByteSize; _YbCommDevice->StopBits = NewStopBits; _YbCommDevice->FlowControl = NewFlowControl; _YbCommDevice->AutoAnswer = NewAutoAAns; _YbCommDevice->InBufSize = NewInBufSize; _YbCommDevice->OutBufSize = NewOutBufSize; _YbCommDevice->Active = _OldActive||_ForceActive; ModalResult = IDOK; } catch(Exception &e) { try { _YbCommDevice->PortNo = _OldPortNo; _YbCommDevice->Baud = _OldBaud; _YbCommDevice->Parity = _OldParity; _YbCommDevice->ByteSize = _OldByteSize; _YbCommDevice->StopBits = _OldStopBits; _YbCommDevice->FlowControl = _OldFlowControl; _YbCommDevice->AutoAnswer = _OldAutoAAns; _YbCommDevice->InBufSize = _OldInBufSize; _YbCommDevice->OutBufSize = _OldOutBufSize; _YbCommDevice->Active = _OldActive; } catch(...) { //do nothing, ignore this error } CbPort->SetFocus(); MessageBox(Handle, e.Message.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP); } } //--------------------------------------------------------------------------- bool __fastcall TFormCommSettings::MoveCtrlFocus(void) { if(ActiveControl == CbPort ){ ActiveControl = CbSelBaud ; return true; } if(ActiveControl == CbSelBaud ){ ActiveControl = CbParity ; return true; } if(ActiveControl == CbParity ){ ActiveControl = CbByteSize ; return true; } if(ActiveControl == CbByteSize ){ ActiveControl = CbStopBits ; return true; } if(ActiveControl == CbStopBits ){ ActiveControl = CbFlow ; return true; } if(ActiveControl == CbFlow ){ ActiveControl = EditAutoAns ; return true; } if(ActiveControl == EditAutoAns ){ ActiveControl = EditInBufSize ; return true; } if(ActiveControl == EditInBufSize){ ActiveControl = EditOutBufSize; return true; } return false; } //--------------------------------------------------------------------------- void __fastcall TFormCommSettings::BnCancelClick(TObject *Sender) { ModalResult = IDCANCEL; } //--------------------------------------------------------------------------- __fastcall TFormCommSettings::TMsgStrings::TMsgStrings() { switch(AppLang.LangType) { case TAppLang::ltGbk: _Msg = _Msg_Chs; break; case TAppLang::ltBig5: _Msg = _Msg_Cht; break; default: _Msg = _Msg_Enu; break; } } //--------------------------------------------------------------------------- AnsiString __fastcall TFormCommSettings::TMsgStrings::fGetMsg(int mt) { return AppLang.FromGBK(_Msg[mt]); } //--------------------------------------------------------------------------- char *TFormCommSettings::TMsgStrings::_Msg_Chs[] = { "确定" , // 0 MsgOK "取消" , // 1 MsgCancel "端口设置" , // 2 MsgPortSet "端口" , // 3 MsgPort "波特率" , // 4 MsgBaud "奇偶校验" , // 5 MsgCheck "数据位" , // 6 MsgBits "停止位" , // 7 MsgStops "数据流控" , // 8 MsgFlow "No parity (无)" , // 9 MsgNoParity "Odd (奇)" , //10 MsgOdd "Even (偶)" , //11 MsgEven "Mark (标记)" , //12 MsgMark "None (无)" , //13 MsgNone "RTS/CTS (硬件)" , //14 MsgRtsCts "Xon/Xoff (软件)" , //15 MsgXonXoff "RTS/CTS & Xon/Xoff (硬&软)" , //16 MsgRtsXon "必须选择端口" , //17 ErrSelPort "必须输入/选择波特率" , //18 ErrSelBaud "无效的波特率" , //19 ErrInvBaud "必须选择数据位" , //20 ErrSelBits "必须选择奇偶校验" , //21 ErrSelCheck "必须选择停止位" , //22 ErrSelStops "必须选择数据流控制" , //23 ErrSelFlow "关于" , //24 MsgAbout "默认" , //25 MsgDefault "端口选项" , //26 StrGbxBase "调制解调器选项" , //27 StrGbxModem "缓存容量" , //28 StrGbxBuffer "自动应答" , //29 MsgAAns "输入缓存" , //30 MsgInBuf "输出缓存" , //31 MsgOutBuf "自动应答必须是 0 - 255 的整数", //32 ErrInvAAns "输入缓存容量错误" , //33 ErrInvInBuf "输出缓存容量错误" , //34 ErrInvOutBuf }; //--------------------------------------------------------------------------- char *TFormCommSettings::TMsgStrings::_Msg_Cht[] = { "確定" , // 0 MsgOK "取消" , // 1 MsgCancel "串列埠設置" , // 2 MsgPortSet "串 列 埠" , // 3 MsgPort "傳輸速率" , // 4 MsgBaud "奇偶校驗" , // 5 MsgCheck "資料位元" , // 6 MsgBits "停止位元" , // 7 MsgStops "資料流控" , // 8 MsgFlow "No parity (無)" , // 9 MsgNoParity "Odd (奇)" , //10 MsgOdd "Even (偶)" , //11 MsgEven "Mark (標記)" , //12 MsgMark "None (無)" , //13 MsgNone "RTS/CTS (硬體)" , //14 MsgRtsCts "Xon/Xoff (軟體)" , //15 MsgXonXoff "RTS/CTS & Xon/Xoff (硬&軟)" , //16 MsgRtsXon "必須選擇串列埠" , //17 ErrSelPort "必須輸入/選擇串列傳輸速率" , //18 ErrSelBaud "無效的串列傳輸速率" , //19 ErrInvBaud "必須選擇資料位元" , //20 ErrSelBits "必須選擇奇偶校驗" , //21 ErrSelCheck "必須選擇停止位元" , //22 ErrSelStops "必須選擇資料流程控制" , //23 ErrSelFlow "關於" , //24 MsgAbout "默認" , //25 MsgDefault "埠選項" , //26 StrGbxBase "數據機選項" , //27 StrGbxModem "緩存容量" , //28 StrGbxBuffer "自動回應" , //29 MsgAAns "輸入緩存" , //30 MsgInBuf "輸出緩存" , //31 MsgOutBuf "自動回應必須是 0 - 255 的整數", //32 ErrInvAAns "輸入緩存容量錯誤" , //33 ErrInvInBuf "輸出緩存容量錯誤" , //34 ErrInvOutBuf }; //--------------------------------------------------------------------------- char *TFormCommSettings::TMsgStrings::_Msg_Enu[] = { "&OK" , // 0 MsgOK "&Cancel" , // 1 MsgCancel "COM port Setup" , // 2 MsgPortSet "COM port" , // 3 MsgPort "Baud" , // 4 MsgBaud "Parity" , // 5 MsgCheck "Byte Size" , // 6 MsgBits "Stop Bits" , // 7 MsgStops "Flow Control" , // 8 MsgFlow "No parity" , // 9 MsgNoParity "Odd" , //10 MsgOdd "Even" , //11 MsgEven "Mark" , //12 MsgMark "None" , //13 MsgNone "RTS/CTS" , //14 MsgRtsCts "Xon/Xoff" , //15 MsgXonXoff "RTS/CTS & Xon/Xoff" , //16 MsgRtsXon "Must select COM Port" , //17 ErrSelPort "Must select baud rate" , //18 ErrSelBaud "Invalid baud rate" , //19 ErrInvBaud "Must select byte size" , //20 ErrSelBits "Must select parity check" , //21 ErrSelCheck "Must select stop bits" , //22 ErrSelStops "Must select flow control" , //23 ErrSelFlow "&About" , //24 MsgAbout "&Default" , //25 MsgDefault "Port" , //26 StrGbxBase "Modem" , //27 StrGbxModem "Buffer" , //28 StrGbxBuffer "Auto Answer" , //29 MsgAAns "Input Buf." , //30 MsgInBuf "Output Buf." , //31 MsgOutBuf "Auto Answer: 0 - 255" , //32 ErrInvAAns "Input Buffer size error" , //33 ErrInvInBuf "Output Buffer size error" , //34 ErrInvOutBuf }; //---------------------------------------------------------------------------