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

📄 main.cpp

📁 一个串口通讯的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        iPackLen=PackLen;
        //计算内存空间
        iLen=3+2+2+4+2+2+(PackLen)+1;

        //分配动态内存空间
        szSendCmd=new unsigned char[iLen+1];
        memset(szSendCmd,0,iLen+1);
        memcpy(szSendCmd,szHead,3);
        szSendCmd[3]=(iLen - 5)/256;
        szSendCmd[4]=(iLen - 5)%256;
        szSendCmd[5]=0x20;
        szSendCmd[6]=iCmdNo;

        szSendCmd[7]=iFileLen>>24;
        szSendCmd[8]=iFileLen>>16;
        szSendCmd[9]=iFileLen>>8;
        szSendCmd[10]=iFileLen;
        //
        szSendCmd[11]=iPackNo/256;
        szSendCmd[12]=iPackNo%256;
        szSendCmd[13]=iPackLen/256;
        szSendCmd[14]=iPackLen%256;
        memcpy(&szSendCmd[15],parm,iPackLen );

        //计算校验和
        szSum=char(0x00);
        for(unsigned int i=0;i<iLen-1;i++)
                szSum+=szSendCmd[i];
        szSendCmd[iLen-1]=szSum;


        //打开串口
        iRetCode=Init232(ipCom,1050);
        if(iRetCode!=0)
            return C_OPEN_COM_ERR;

        //清除输出缓冲
        PurgeComm(hCom,PURGE_TXCLEAR);
        //清除输入缓冲
        PurgeComm(hCom,PURGE_RXCLEAR);
        dwByteWrite=0;
        //发送数据8字节
        Sleep(300);
        if(WriteFile(hCom,szSendCmd,iLen,&dwByteWrite,NULL)==false)
        {
                ClearCommError(hCom,&dwErrorMask,&comst);
                Close232();
                return C_WRITE_COM_ERR;
        }
         //延时
        //iSeconds=10000;
        if(SetTimeOut(iSeconds)!=0)
        {
        	Close232();
        	return C_SETTIMES_ERR;
        }
        //接收数据
        dwByteRead=0;
        //接收数包头
        ReadFile(hCom,szRecHeadBuf,3,&dwByteRead,NULL);
        if(dwByteRead!=3)
        {
                delete[] szSendCmd;
                Close232();
                return C_DATA_LEN_ERR;
        }
        if(memcmp(szRecHeadBuf,szHead,3)!=0)
        {
                delete[] szSendCmd;
                Close232();
                return C_DATA_HEAD_ERR;
        }
        //接收数据长度值
        dwByteRead=0;
        ReadFile(hCom,szRecLengthBuf,2,&dwByteRead,NULL);
        if(dwByteRead!=2)
        {
                delete[] szSendCmd;
                Close232();
                return C_DATA_LEN_ERR;
        }
        iLenF=szRecLengthBuf[0];
        iLenS=szRecLengthBuf[1];
        iDataLen=iLenF*256+iLenS;
        dwByteRead=0;
        szDataBuf=new unsigned char[iDataLen+1];
        memset(szDataBuf,0,iDataLen+1);
        ReadFile(hCom,szDataBuf,iDataLen,&dwByteRead,NULL);
        //接收数据数量不对
        if(dwByteRead!=iDataLen)
        {
                delete[] szDataBuf;
                delete[] szSendCmd;
                Close232();
                return C_DATA_LEN_ERR;
        }

        szSum=0x1A+0x72+0x73;
        szSum+=szRecLengthBuf[0];
        szSum+=szRecLengthBuf[1];
        for(unsigned int i=0;i<iDataLen-1;i++)
        {
                szSum+=szDataBuf[i];
        }
        //校验和出错
        if(szSum!=szDataBuf[iDataLen-1])
        {
                delete[] szDataBuf;
                delete[] szSendCmd;
                Close232();
                return C_CRCERR;
        }
        //返回命令字 //特征提取
        if((szDataBuf[0]!=0x20) || (szDataBuf[1]!=iCmdNo))
        {
                delete[] szDataBuf;
                delete[] szSendCmd;
                Close232();
                return C_CMDERR;
        }
        if(szDataBuf[3]!=0x00)
        {
                iRetCode=szDataBuf[3];
                delete[] szDataBuf;
                delete[] szSendCmd;
                Close232();
                return iRetCode;
        }
        else
        {
                delete[] szDataBuf;
                delete[] szSendCmd;
                Close232();
                return 0;
        }

}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    if (OpenDialog1->Execute())
        Edit1->Text=OpenDialog1->FileName;
            
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Close();    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{                
    if (OpenDialog1->Execute())
        Edit2->Text=OpenDialog1->FileName;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
    if (OpenDialog1->Execute())
        Edit3->Text=OpenDialog1->FileName;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
    if (OpenDialog1->Execute())
        Edit4->Text=OpenDialog1->FileName;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
    if (OpenDialog1->Execute())
        Edit5->Text=OpenDialog1->FileName;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    iCom  = 1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
    iCom=ComboBox1->ItemIndex +1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TMemoryStream *msFile;
    unsigned char *szBuf;
    unsigned int iLen,iTimes;
    int iCount;

    msFile=new TMemoryStream();
    iCount=0;
    if (CheckBox1->Checked) iCount++; 
    if (CheckBox2->Checked) iCount++;
    if (CheckBox3->Checked) iCount++;
    if (CheckBox4->Checked) iCount++;
    if (CheckBox5->Checked) iCount++;
    if (iCount==0)  return;

    iTimes=500;
    iRetCode=DTM_FlashDown_Connect(&iCom,&iTimes,szBuf);
    if (iRetCode!=0)
    {
        msFile->Free();
        ShowMessage("发送'更新FLASH命令'出错,代码:"+IntToStr(iRetCode));
        return;
    }

    if (CheckBox1->Checked)
    {
        Label2->Caption="正在下载BOOTLOAD代码命令";
        msFile->LoadFromFile(Edit1->Text);
        if (msFile->Size==0)
        {
            msFile->Free();
            ShowMessage("文件不存在或为空!");
            return;
        }
        iLen=msFile->Size;
        ProgressBar1->Max=iLen/1024+1;
        ProgressBar1->Position=0;
        Application->ProcessMessages();
        szBuf=new unsigned char[1025];
        memset(szBuf,0,1025);
        for (unsigned int i=0;i<(iLen/1024+1);i++)
        {
            if (i==iLen/1024)
            {
                msFile->Read(szBuf,iLen - i*1024);
                iRetCode=DTM_FlashDown_Transfer(&iCom,&iTimes,0x31,iLen,&i,iLen - i*1024,szBuf);
            }
            else
            {
                msFile->Read(szBuf,1024);
                iRetCode=DTM_FlashDown_Transfer(&iCom,&iTimes,0x31,iLen,&i,1024,szBuf);
            }
            if (iRetCode!=0)
            {
                msFile->Free();
                ShowMessage("下载BOOTLOAD代码命令出错,代码:"+IntToStr(iRetCode));
                delete[] szBuf;
                return;
            }
            ProgressBar1->Position++;
            Application->ProcessMessages();
        }
        Label2->Caption="";   
        delete[] szBuf;
        msFile->Clear();
    }   
    if (CheckBox2->Checked)
    {
        Label2->Caption="正在下载DOWNCODE";
        Application->ProcessMessages();
        msFile->LoadFromFile(Edit2->Text);
        if (msFile->Size==0)
        {
            msFile->Free();
            ShowMessage("文件不存在或为空!");
            return;
        }
        iLen=msFile->Size;     
        ProgressBar1->Max=iLen/1024+1;
        ProgressBar1->Position=0;
        Application->ProcessMessages();
        szBuf=new unsigned char[1025];
        memset(szBuf,0,1025);
        iTimes=2000;
        for (unsigned int i=0;i<(iLen/1024+1);i++)
        {
            if (i==iLen/1024)          
            {
                msFile->Read(szBuf,iLen - i*1024);
                iRetCode=DTM_FlashDown_Transfer(&iCom,&iTimes,0x32,iLen,&i,iLen - i*1024,szBuf);
            }
            else         
            {
                msFile->Read(szBuf,1024);
                iRetCode=DTM_FlashDown_Transfer(&iCom,&iTimes,0x32,iLen,&i,1024,szBuf);
            }
            if (iRetCode!=0)
            {
                msFile->Free();
                ShowMessage("下载DOWNCODE代码命令出错,代码:"+IntToStr(iRetCode));  
                delete[] szBuf;
                return;
            }            
            ProgressBar1->Position++;
            Application->ProcessMessages();
        }
        Label2->Caption=""; 
        delete[] szBuf;      
        msFile->Clear();
    }
    if (CheckBox3->Checked)
    {                    
        Label2->Caption="正在下载应用程序";
        msFile->LoadFromFile(Edit3->Text);
        if (msFile->Size==0)
        {
            msFile->Free();
            ShowMessage("文件不存在或为空!");
            return;
        }
        iLen=msFile->Size;       
        ProgressBar1->Max=iLen/1024+1;
        ProgressBar1->Position=0;
        Application->ProcessMessages();
        szBuf=new unsigned char[1025];
        memset(szBuf,0,1025);
        for (unsigned int i=0;i<(iLen/1024+1);i++)
        {
            if (i==iLen/1024)     
            {
                msFile->Read(szBuf,iLen - i*1024);
                iRetCode=DTM_FlashDown_Transfer(&iCom,&iTimes,0x33,iLen,&i,iLen - i*1024,szBuf);
            }
            else     
            {
                msFile->Read(szBuf,1024);
                iRetCode=DTM_FlashDown_Transfer(&iCom,&iTimes,0x33,iLen,&i,1024,szBuf);
            }
            if (iRetCode!=0)
            {
                msFile->Free();
                ShowMessage("下载应用程序出错,代码:"+IntToStr(iRetCode)); 
                delete[] szBuf;
                return;
            }        
            ProgressBar1->Position++;
            Application->ProcessMessages();
        }  
        Label2->Caption=""; 
        delete[] szBuf;  
        msFile->Clear();

    }

    if (CheckBox4->Checked)
    {                   
        Label2->Caption="正在下载汉字库";   
        Application->ProcessMessages();
        msFile->LoadFromFile(Edit4->Text);
        if (msFile->Size==0)
        {
            msFile->Free();
            ShowMessage("文件不存在或为空!");
            return;
        }
        iLen=msFile->Size;  
        ProgressBar1->Max=iLen/1024+1;
        ProgressBar1->Position=0;
        Application->ProcessMessages();
        szBuf=new unsigned char[1025];
        memset(szBuf,0,1025);
        for (unsigned int i=0;i<(iLen/1024+1);i++)
        {
            if (i==iLen/1024)  
            {
                msFile->Read(szBuf,iLen - i*1024);
                iRetCode=DTM_FlashDown_Transfer(&iCom,&iTimes,0x34,iLen,&i,iLen - i*1024,szBuf);
            }
            else     
            {
                msFile->Read(szBuf,1024);
                iRetCode=DTM_FlashDown_Transfer(&iCom,&iTimes,0x34,iLen,&i,1024,szBuf);
            }
            if (iRetCode!=0)
            {
                msFile->Free();
                ShowMessage("下载汉字库出错,代码:"+IntToStr(iRetCode));  
                delete[] szBuf;
                return;
            }            
            ProgressBar1->Position++;
            Application->ProcessMessages();

        }  
        Label2->Caption="";
        delete[] szBuf;   
        msFile->Clear();

    }
       
    if (CheckBox5->Checked)
    {              
        Label2->Caption="正在下载其他代码";  
        Application->ProcessMessages();
        msFile->LoadFromFile(Edit5->Text);
        if (msFile->Size==0)
        {
            msFile->Free();
            ShowMessage("文件不存在或为空!");
            return;
        }
        iLen=msFile->Size;    
        ProgressBar1->Max=iLen/1024+1;
        ProgressBar1->Position=0;
        Application->ProcessMessages();
        szBuf=new unsigned char[1025];
        memset(szBuf,0,1025);
        for (unsigned int i=0;i<(iLen/1024+1);i++)
        {
            if (i==iLen/1024) 
            {
                msFile->Read(szBuf,iLen - i*1024);
                iRetCode=DTM_FlashDown_Transfer(&iCom,&iTimes,0x35,iLen,&i,iLen - i*1024,szBuf);
            }
            else       
            {
                msFile->Read(szBuf,1024);
                iRetCode=DTM_FlashDown_Transfer(&iCom,&iTimes,0x35,iLen,&i,1024,szBuf);
            }
            if (iRetCode!=0)
            {
                msFile->Free();
                ShowMessage("下载其他代码出错,代码:"+IntToStr(iRetCode));   
                delete[] szBuf;
                return;
            }                
            ProgressBar1->Position++;
            Application->ProcessMessages();

        }  
        Label2->Caption="";
        delete[] szBuf; 
        msFile->Clear();

    }         
    iTimes=500;
    iRetCode=DTM_FlashDown_Write(&iCom,&iTimes,szBuf);
    if (iRetCode!=0)
    {
        msFile->Free();
        ShowMessage("发送'重启命令'出错,代码:"+IntToStr(iRetCode));
        return;
    }
    msFile->Free();
    ShowMessage("下载成功!");

}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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