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

📄 main.cpp

📁 BCB 串口通信
💻 CPP
📖 第 1 页 / 共 2 页
字号:
          // '0'~'9'
          !((p[i]>47) &&(p[i]<58) || (p[i]>64) &&(p[i]<91) || (p[i]>96) &&(p[i]<123)) )
            i++;
        if (((i+1)>sin.Length()) ||
          !((p[i+1]>47) &&(p[i+1]<58) || (p[i+1]>64) &&(p[i+1]<91) || (p[i+1]>96) &&(p[i+1]<123)) )
            st =p[i];
        else
            st =AnsiString(p[i]) +AnsiString(p[i+1]);

        try
        {
            if (HexToBin(st.c_str(), (char*)&d, 4)>0)
            {
                ShowMessage(char(d));
                sr = sr+char(d);
            }
        }
        catch(...)
        {
        }
        i +=2;
    }

    */

    int d;
    AnsiString sr ="";
    stringstream ss;

    ss << sin.c_str();

    while (ss >> hex >>d)
	sr = sr +Format("%d", ARRAYOFCONST((d)));

    return sr;
}
//---------------------------------------------------------------------------


void Tfrmmain::sendString(const AnsiString &sData)
{
    if (Comm1->WriteCommData(sData.c_str(), sData.Length()))
    {
        FTXNum = FTXNum+sData.Length();
        strRxTx = Format(" Rx:%d;   Tx:%d", ARRAYOFCONST((FRXNum, FTXNum)));
        SendMessage(mainStBar->Handle, SB_SETTEXT, 2, (int)strRxTx.c_str());
    }
}
//---------------------------------------------------------------------------

void __fastcall Tfrmmain::Comm1ReceiveData(TObject *Sender, Pointer Buffer,
      WORD BufferLength)
{
    AnsiString st;

    //数据字符显示方式
    //自动清空
    if (Memo1->Lines->Count > 100)
        Memo1->Lines->Clear();
	
    st.SetLength(BufferLength);
    Move(Buffer, st.c_str(), BufferLength);
    handleData(st.c_str(), BufferLength);

    if (cbDisHex->Checked)
        Memo1->Lines->Add(StrToHexStr(st));
    else
        Memo1->Lines->Add(st);

    FRXNum +=BufferLength;
    ncr +=BufferLength;
    if (ncr==80)
    {
        Memo1->Lines->Add("\n");
        ncr=0;
    }
    strRxTx = Format(" Rx:%d;   Tx:%d", ARRAYOFCONST((FRXNum, FTXNum)));
    SendMessage(mainStBar->Handle, SB_SETTEXT, 2, (int)strRxTx.c_str());
}
//---------------------------------------------------------------------------

void __fastcall Tfrmmain::sbtnPortClick(TObject *Sender)
{
    int BaudRate;

    Screen->Cursor = crHourGlass;
    sbtnPort->Enabled = false;
    try
    {

    if (!IsPortOpen) // 打开串口
    {
        if (!TryStrToInt(CmbBRate->Text, BaudRate))
        {
            Application->MessageBox("波特率设定有误\n请重新输入", SHintTitle, MB_ICONWARNING +MB_OK);
            CmbBRate->SetFocus();

            return;
        }

        Comm1->StartComm();
        IsPortOpen = true;
        FRXNum =0;
        FTXNum =0;
    }
    else //关闭串口
    {
        Comm1->StopComm();
        IsPortOpen = false;
    };
    setControlState();
    sbtnPort->Enabled = true;
    Screen->Cursor = crDefault;
    }
    catch(...)
    {
        sbtnPort->Enabled = true;
        Screen->Cursor = crDefault;
    }
}
//---------------------------------------------------------------------------

void __fastcall Tfrmmain::setControlState()
{
    CmbPort->Enabled = !IsPortOpen;
    CmbBRate->Enabled = !IsPortOpen;
    CmbPBit->Enabled = !IsPortOpen;
    CmbDBit->Enabled = !IsPortOpen;
    CmbSBit->Enabled = !IsPortOpen;

    if (IsPortOpen) // 串口已打开
    {
        loadBmp(sbtnPort->Glyph, SResLedOff);
        mc_OpenComm->Caption ="关闭串口(&S)";
        sbtnPort->Hint ="关闭串口|";

        strPortStatus =Format(" STATUS: %s Opened %s %s %s %s",ARRAYOFCONST((CmbPort->Text,
            IntToStr(Comm1->BaudRate),CmbPBit->Text, CmbSBit->Text,CmbDBit->Text)));
    }
    else // 串口已关闭
    {
        loadBmp(sbtnPort->Glyph, SResLedOn);
        mc_OpenComm->Caption ="打开串口(&S)";
        sbtnPort->Hint ="打开串口|";

        strPortStatus =" STATUS: COM Port Closed";
    };
    SendMessage(mainStBar->Handle, SB_SETTEXT, 1, (int)strPortStatus.c_str());
}
//---------------------------------------------------------------------------


void __fastcall Tfrmmain::mc_TestClick(TObject *Sender)
{
    if(IsPortOpen)
    {
        if (cbsendHex->Checked)
            sendString(HexStrToStr(Memo2->Text));
        else
            sendString(Memo2->Text);
    }
}
//---------------------------------------------------------------------------


void __fastcall Tfrmmain::sbtnSetPClick(TObject *Sender)
{
    LockWindowUpdate(frmmain->Handle);
    Panel2->Visible =!Panel2->Visible;
    if (Panel2->Visible)
    {
        loadBmp(sbtnSetP->Glyph, SResM2O);
        mo_SetP->Caption = "隐藏设置(&P)";
        sbtnSetP->Hint = "隐藏设置面板|";
    }
    else
    {
        loadBmp(sbtnSetP->Glyph, SResO2M);
        mo_SetP->Caption = "显示设置(&P)";
        sbtnSetP->Hint = "显示设置面板|";
    }
    LockWindowUpdate(NULL);
}
//---------------------------------------------------------------------------


void __fastcall Tfrmmain::sbtnShowDClick(TObject *Sender)
{
    LockWindowUpdate(frmmain->Handle);
    Memo1->Visible =!Memo1->Visible;
    Chart1->Visible = !Memo1->Visible;
    if (Memo1->Visible)
    {
        loadBmp(sbtnShowD->Glyph, SResCurve);
        mo_ShowD->Caption ="显示曲线(&D)";
        sbtnShowD->Hint ="显示曲线|";
    }
    else
    {
        loadBmp(sbtnShowD->Glyph, SResText);
        mo_ShowD->Caption ="显示文本(&D)";
        sbtnShowD->Hint ="显示文本|";
    }
    LockWindowUpdate(NULL);    
}
//---------------------------------------------------------------------------

void __fastcall Tfrmmain::sbtnStickClick(TObject *Sender)
{
    IsOnTop = !IsOnTop;
    if (IsOnTop)
    {
        SetWindowPos(this->Handle, HWND_TOPMOST, this->Left, this->Top,
                    this->Width, this->Height, 0);
        loadBmp(sbtnStick->Glyph, SResStick2);
    }
    else
    {
        SetWindowPos(this->Handle, HWND_NOTOPMOST, this->Left, this->Top,
                    this->Width, this->Height, 0);
        loadBmp(sbtnStick->Glyph, SResStick1);
    };
}
//---------------------------------------------------------------------------

void Tfrmmain::handleData(char* p, WORD BuffLen)
{
    Scalar val;

    for(int i=0; i<BuffLen; i++)
    {
        tmpVal[nbt] =p[i];
        nbt++;
        if ((nbt+1)==NBYTE) 
        {
            nbt =0;
            val = Scalar(*tmpVal);

            nsp++;
            if (nsp==ScrollPoints)
            {	
                DoScrollPoints();
                nsp =0;
            }
        }
    }	
}
//---------------------------------------------------------------------------

void __fastcall Tfrmmain::RealTimeAdd(TChartSeries *Series, Scalar val)
{
    // Add new point
    Series->AddXY(FRXNum, val, "", clTeeColor);
}
//---------------------------------------------------------------------------

void __fastcall Tfrmmain::DoScrollPoints(void)
{
    /*
    Scalar tmpMin,tmpMax;

    // Delete multiple points with a single call.
    // Much faster than deleting points using a loop.
    //Series1->Delete(0,ScrollPoints);
    // Scroll horizontal bottom axis
    //Scalar tmp = Series1->XValues->Last();
    Chart1->BottomAxis->SetMinMax(tmp-MaxPoints+ScrollPoints,tmp+ScrollPoints);

    // Scroll vertical left axis
    tmpMin = Series1->YValues->MinValue;
    tmpMax = Series1->YValues->MaxValue;

    Chart1->LeftAxis->SetMinMax(tmpMin-tmpMin/5,tmpMax+tmpMax/5);

    // Do chart repaint after deleting and scrolling
    Application->ProcessMessages();
    */
}
//---------------------------------------------------------------------------



⌨️ 快捷键说明

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