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

📄 recthread.~cpp

📁 设计目的:对PC机的8250串行通讯接口(COM1、COM2)进行接口编程
💻 ~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;
//---------------------------------------------------------------------------

//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall RecThread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------

__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->PbReceive->Position=100*ulLengthWrited/filelength;
}
//---------------------------------------------------------------------------

void __fastcall RecThread::UpdateReceiveEnd(void)
{
//    Form1->btnCancelR->Enabled=false;
    MessageDlg("发送完毕!", mtInformation, TMsgDlgButtons() << mbOK, 0);
    //SerialPort->PbReceive->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));
//    aSignal=String(cReceiveBuf);
    if(!strcmp(m_ReceiveBuf,"FileFlag"))
    {   
        Synchronize(GetFileSignal);
        if(Result)
        {
          //新建可读写文件
            iFileRHandle=FileCreate(FILENAME,fmOpenReadWrite);
            if(iFileRHandle==-1)
            {
                Synchronize(Error);
                return;
            }     // if(iFileHandle<0)
//            unsigned long SignalLength;
            ReceiveFile=true;
            filelength=FileFlag.length;
//            strcpy(FileFlag.FileSendFlag,ready);
            SendData(m_hComm,"Ready",5,&SignalLength); //发送“准备就绪”信号
//            Synchronize(SetCancelR);
        }    //  if(SDEx)
    } 
    else if(!strcmp(m_ReceiveBuf,"Ready"))
        {
            SetEvent(hReceiveReady);
        }
    else if(!ReceiveFile)
        {
            Synchronize(UpdataMemo);
        }
     else if(!strcmp(m_ReceiveBuf,"CancelR"))
      //对方取消文件接收
     {
//         tcsReadyLock->Acquire();
         bReady=false;
//         tcsReadyLock->Release();
         unsigned long SignalLength;
         SendData(m_hComm,"CancelS",7,&SignalLength);
         Synchronize(UpdateCancelR);
     }
     else if(!strcmp(m_ReceiveBuf,"CancelS"))
       //取消文件传输
     {
         FileClose(iFileRHandle);
         ulLengthWrited=0;
         DeleteFile(filename);
         iFileRHandle=-1;
//         filename="";
         ReceiveFile=false;
         Synchronize(UpdateCancelS);
     }
    else
        {
            int length=FileWrite(iFileRHandle,m_ReceiveBuf,BytesRead);
            ulLengthWrited=ulLengthWrited+length;
            Synchronize(UpdatePBReceiveFile);
            if(ulLengthWrited>=filelength)
            {
                FileClose(iFileRHandle);
//                filename="";
                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);
}
//---------------------------------------------------------------------------

void __fastcall RecThread::UpdateCancelR()
{
// Form1->btnCancelR->Enabled=false;
    //MessageDlg("对方取消发送!", mtInformation, TMsgDlgButtons() << mbOK, 0);
    //SerialPort->PbSend->Position=0;
}
//---------------------------------------------------------------------------
void __fastcall RecThread::UpdateCancelS()
{
// Form1->btnCancelR->Enabled=false;
    //MessageDlg("发送已取消!", mtInformation, TMsgDlgButtons() << mbOK, 0);
    //SerialPort->PbReceive->Position=0;
}
//---------------------------------------------------------------------------



⌨️ 快捷键说明

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