📄 commmainunit.cpp
字号:
DataReceived = RMemo->Text;
return;
case htSeperator:
break;
case htValid:
Byte2 = RMemo->Text.c_str()[i++];
if ( ConvertByte( Byte2) != htValid ) {
ShowMessage("有无法转换的字符!");
DataReceived = RMemo->Text;
return;
}
DataReceived += (char)Combine(Byte1,Byte2);
break;
}
}
DataModified = true;
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::RHEXClick(TObject *Sender)
{
int i;
for ( i = 0; i < RMemo->Text.Length(); i++ )
sprintf(&tempStore[i*3],"%02X ", RMemo->Text.c_str()[i] );
tempStore[i*3] = '\0';
RMemo->Text = tempStore;
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::OpenFileClick(TObject *Sender)
{
if ( OpenDialog1->Execute() ) {
SMemo->Clear();
SMemo->Lines->LoadFromFile( OpenDialog1->FileName );
}
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::intCharsChange(TObject *Sender)
{
Comm->RThreshold = intChars->Value;
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::maxStoreChange(TObject *Sender)
{
if ( tempStore != NULL )
delete tempStore;
tempStore = new char[maxStore->Value*3+20]; // 是最大保存字符数的 3 倍
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::RepeatIntervalChange(TObject *Sender)
{
RepeatTimer->Interval = RepeatInterval->Value;
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::RepeatSendClick(TObject *Sender)
{
if ( RepeatSend->Checked ) {
RepeatInterval->Enabled = false;
Send->Enabled = false;
SendClick(this);
}
else {
RepeatInterval->Enabled = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::RepeatTimerTimer(TObject *Sender)
{
RepeatTimer->Enabled = false;
RepeatSendClick(this);
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::SASCIIClick(TObject *Sender)
{
EnableAddParity();
SMemo->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::SHEXClick(TObject *Sender)
{
EnableAddParity();
SMemo->SetFocus();
}
//---------------------------------------------------------------------------
int __fastcall TCommMain::SMemoHexToChar(Byte *store,int &from,int PacketLen)
// store 存放转换结果
// from 从 from 位置开始转换, 同时返回下一次可以转换的位置
// PacketLen 要求转换后的字符串的最大长度
// 返回: 得到的转换后的字符串的长度
{
int datalen = SMemo->Text.Length();
if ( PacketLen == 0 )
PacketLen = datalen;
int i = 0; // 字符计数
bool FirstHalf = true;
Byte Byte0,Byte1;
hexType hextype;
Byte1 = '\0';
while ( from < datalen && i < PacketLen ) {
Byte0 = SMemo->Text.c_str()[from++];
hextype = ConvertByte( Byte0 );
switch ( hextype ) {
case htInvalid:
ShowMessage("有非法字符!");
return 0;
case htSeperator:
if ( !FirstHalf ) { // 用一位表示的十六进制数据
store[i++] = Byte1;
FirstHalf = true;
}
break;
case htValid:
if ( FirstHalf ) {
Byte1 = Byte0;
FirstHalf = false;
}
else { // 用两位表示的十六进制数
store[i++] = Combine(Byte1,Byte0);//Byte1;
FirstHalf = true;
}
} // switch
} // while
if ( !FirstHalf )
store[i++] = Byte1;
return i;
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::AddParityClick(TObject *Sender)
{
char tmp[20];
int DecLen;
int HexLen = SMemo->Text.Length();
if ( HexLen >0 ) {
Byte *temp = new Byte[HexLen/2+1];
int from = 0;
if ( (DecLen=SMemoHexToChar(temp,from)) > 0 ) {
tmp[0] = '\0';
if ( ChooseParity->BytesOffset->Value > DecLen-1 )
ChooseParity->BytesOffset->Value = 0;
ChooseParity->BytesOffset->MaxValue = DecLen-1;
ChooseParity->ShowModal();
if ( ChooseParity->ModalResult != mrOk )
return;
if (ChooseParity->UseCRC->Checked ) {
unsigned int BitCount;
unsigned long Polynomial;
bool Reverse;
unsigned long Initial;
unsigned long FinalMask;
BitCount = ChooseParity->CRCBits->Text.ToInt();
Reverse = ChooseParity->Reverse->Checked;
sscanf( Trim(ChooseParity->Polynomial->Text).c_str(),"%x",&Polynomial);
sscanf( Trim(ChooseParity->Initial->Text).c_str(),"%x",&Initial);
sscanf( Trim(ChooseParity->FinalMask->Text).c_str(),"%x",&FinalMask);
Crc crc(BitCount, Polynomial, Reverse, Initial, FinalMask);
unsigned long ret32 = crc.getcrc((char*)&temp[ChooseParity->BytesOffset->Value],
DecLen-ChooseParity->BytesOffset->Value);
switch ( ChooseParity->CRCBits->Text.ToInt() ) {
case 8:
sprintf(tmp," %02X", ret32&0x0ff);
break;
case 16:
if ( ChooseParity->HighLow->Checked )
sprintf(tmp," %02X %02X ", (ret32>>8)&0x0ff,ret32&0x0ff );
else
sprintf(tmp," %02X %02X ", ret32&0x0ff,(ret32>>8)&0x0ff );
break;
case 32:
if ( ChooseParity->HighLow->Checked )
sprintf(tmp," %02X %02X %02X % 02X ", (ret32>>24)&0x0ff,
(ret32>>16)&0x0ff,(ret32>>8)&0x0ff,ret32&0x0ff );
else
sprintf(tmp," %02X %02X %02X %02X ", ret32&0x0ff,(ret32>>8)&0xff,
(ret32>>16)&0xff,(ret32>>24)&0xff );
break;
}
}
else if ( ChooseParity->UseLPC->Checked )
sprintf(tmp," %02X", GetLPCParityByte((Byte*)&temp[ChooseParity->BytesOffset->Value],
DecLen-ChooseParity->BytesOffset->Value) );
else if ( ChooseParity->UseSUMUP->Checked ) {
unsigned short ret16 = Sumup((Byte*)&temp[ChooseParity->BytesOffset->Value],
DecLen-ChooseParity->BytesOffset->Value);
if ( ChooseParity->HighLow->Checked )
sprintf(tmp," %02X %02X ", (ret16>>8),ret16&0x0ff );
else
sprintf(tmp," %02X %02X ", ret16&0x0ff,(ret16>>8) );
}
SMemo->Text = SMemo->Text + tmp;
}
delete temp;
}
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::WDFlashTimerTimer(TObject *Sender)
{
if (WD->Brush->Color == clGreen)
WD->Brush->Color = clLime;
else {
WD->Brush->Color = clGreen;
WDFlashTimer->Enabled = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::RDFlashTimerTimer(TObject *Sender)
{
if (RD->Brush->Color == clGreen)
RD->Brush->Color = clLime;
else {
RD->Brush->Color = clGreen;
RDFlashTimer->Enabled = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::Panel3Click(TObject *Sender)
{
TAboutBoxForm::ShowAboutBox();
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::PrevBtnClick(TObject *Sender)
{
if ( LastHistory == CurrHistory || (!HistoryFull && LastHistory<1) ) {
// 是历史记录中的最后一项
PrevBtn->Enabled = false;
SMemo->Text = History[0];
if ( UseHex[0] )
SHEX->Checked = true;
else
SASCII->Checked = true;
}
else { // 非最后一项
NextBtn->Enabled = true;
NextHistory = LastHistory;
if ( LastHistory%HISTNUM +1 == CurrHistory) { // 是第一项
History[0] = SMemo->Text;
UseHex[0] = SHEX->Checked;
}
SMemo->Text = History[LastHistory];
if ( UseHex[LastHistory--] )
SHEX->Checked = true;
else
SASCII->Checked = true;
if ( LastHistory < 1 && HistoryFull )
LastHistory = HISTNUM;
}
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::NextBtnClick(TObject *Sender)
{
PrevBtn->Enabled = true;
LastHistory = NextHistory;
NextHistory = NextHistory%HISTNUM + 1;
if ( NextHistory == CurrHistory) {
NextHistory = 0;
NextBtn->Enabled = false;
}
SMemo->Text = History[NextHistory];
if ( UseHex[NextHistory] )
SHEX->Checked = true;
else
SASCII->Checked = true;
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::EnableAddParity(void)
// 判断是否允许加入校验
{
AddParity->Enabled = SHEX->Checked && Trim(SMemo->Text).Length()>0;
// AddParity->Enabled = true;
// if ( SMemo->Text.Length() <= 0 && AddParity->Enabled )
// AddParity->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::SMemoKeyPress(TObject *Sender, char &Key)
{
if ( SHEX->Checked && !( (Key>='0' && Key<='9') ||
(Key>='A' && Key<='F') ||
(Key>='a' && Key<='f') ||
Key=='\r' || Key=='\b' ||
Key==' ' ) )
Key = 0;
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::FormClose(TObject *Sender, TCloseAction &Action)
{
if ( Comm->PortOpen ) {
Comm->ClosePort();
delete Comm;
}
}
//---------------------------------------------------------------------------
void __fastcall TCommMain::RepeatCountLabelDblClick(TObject *Sender)
{
RepeatCount = 0;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -