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

📄 commmainunit.cpp

📁 串口调试程序源程序。 非常好的串口调试助手
💻 CPP
📖 第 1 页 / 共 2 页
字号:
         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 + -