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

📄 recthread.~cpp

📁 使用PC机的COM口
💻 ~CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "RecThread.h"
#pragma package(smart_init)

DWORD BytesRead;
char m_ReceiveBuf[1025];
bool Result;
bool ReceiveFile;
bool bReady;
LPOVERLAPPED lpOverlappedRead;
AnsiString aSignal,FILENAME;
unsigned long SignalLength;
unsigned long ulLengthWrited;
unsigned long filelength;
int iFileRHandle;
FILEFLAG FileFlag;

__fastcall RecThread::RecThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------

void __fastcall RecThread::UpdataMemo()
{
    SerialPort->Memo->Lines->Add("已收到数据"+IntToStr(BytesRead)+"字节: "+"     ("+Date()+"   "+Time()+")");
    SerialPort->Memo->Lines->Add(m_ReceiveBuf);
    SerialPort->Memo->Lines->Add("---------------------------------------------");
}
//---------------------------------------------------------------------------

void __fastcall RecThread::UpdatePBReceiveFile(void)
{
   SerialPort->ProgressBar->Position=100*ulLengthWrited/filelength;
}
//---------------------------------------------------------------------------

void __fastcall RecThread::UpdateReceiveEnd(void)
{
    MessageDlg("发送完毕!", mtInformation, TMsgDlgButtons() << mbOK, 0);
    SerialPort->ProgressBar->Position=0;
}
//---------------------------------------------------------------------------


void __fastcall RecThread::Execute()
{
    //---- Place thread code here ---
    while(true)
    {
        memset(m_ReceiveBuf,0,sizeof(m_ReceiveBuf));
        if(!ReadFile(m_hComm,             //串口句柄
                     m_ReceiveBuf,        //输入缓冲区地址
                     1024,               //想读入的字符数
                     &BytesRead,         //实际读出的字节数的变量指针
                     lpOverlappedRead))  //重叠结构指针
        {
             if(GetLastError()== ERROR_IO_PENDING)
             {
                 DWORD RESULT;
                 do
                 {
                     RESULT=WaitForSingleObject(lpOverlappedRead->hEvent,1000);
                 }while(RESULT!=WAIT_OBJECT_0);
                 if(GetOverlappedResult(m_hComm,lpOverlappedRead,&BytesRead,false))
                     if(BytesRead>0)
                         DataDisposal();
            }
        }
    }
}
//---------------------------------------------------------------------------

void __fastcall RecThread::DataDisposal()
{
    memcpy(&FileFlag,m_ReceiveBuf,sizeof(FILEFLAG));
    if(!strcmp(m_ReceiveBuf,"FileFlag"))
    {
        Synchronize(GetFileSignal);//读取文件名
        if(Result)
        {

            iFileRHandle=FileCreate(FILENAME,fmOpenReadWrite); //新建可读写文件
            if(iFileRHandle==-1)
            {//新建文件失败
                Synchronize(Error);
                return;
            }
            ReceiveFile=true;
            filelength=FileFlag.length;
            SendData(m_hComm,"Ready",5,&SignalLength); //发送“准备就绪”信号
        }    //  if(SDEx)
    }
    else if(!strcmp(m_ReceiveBuf,"Ready"))
        {
            SetEvent(hReceiveReady);
        }
    else if(!ReceiveFile)
        {
            Synchronize(UpdataMemo);
        }
    else
        {
            int length=FileWrite(iFileRHandle,m_ReceiveBuf,BytesRead);
            ulLengthWrited=ulLengthWrited+length;
            Synchronize(UpdatePBReceiveFile);
            if(ulLengthWrited>=filelength)
            {//如果接收的内容大于文件大小
                FileClose(iFileRHandle);
                ReceiveFile=false;
                ulLengthWrited=0;
                Synchronize(UpdateReceiveEnd);
            }
        }
}
//---------------------------------------------------------------------------

void __fastcall RecThread::GetFileSignal()
{ //读取保存文件的字符串
        //---- Place thread code here ----
    SerialPort->SaveDialog->FileName=FileFlag.name;
    Result=SerialPort->SaveDialog->Execute();
    FILENAME=SerialPort->SaveDialog->FileName;
}
//---------------------------------------------------------------------------

void __fastcall RecThread::Error()
{
        //---- Place thread code here ----
    MessageDlg("新建文件失败!", mtError, TMsgDlgButtons() << mbOK, 0);
}
//---------------------------------------------------------------------------



⌨️ 快捷键说明

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