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

📄 tcomm.cpp

📁 个人早期编写的支持wavecom modem的串口短信控件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        case comXonXoff:
                FRtsControl = RtsEnable;
                FDtrControl = DtrEnable;
                FSettings>>OutxCtsFlow>>OutxDsrFlow<<OutxXonXoffFlow<<InxXonXoffFlow;
                break;
        case comRTS:
                FRtsControl = RtsHandshake;
                FDtrControl = DtrEnable;
                FSettings<<OutxCtsFlow>>OutxDsrFlow>>OutxXonXoffFlow>>InxXonXoffFlow;
                break;
        case comRTSXonXoff:
                FRtsControl = RtsHandshake;
                FDtrControl = DtrEnable;
                FSettings<<OutxCtsFlow>>OutxDsrFlow<<OutxXonXoffFlow<<InxXonXoffFlow;
                break;
        }

        if (hComm !=0)
                SetProperty();
}
//---------------------------------------------------------------------------
//	FSetDTREnable::DTREnable属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetDTREnable(bool NewDTREnable)
{
        if (hComm ==0)
                return;

        EscapeCommFunction(hComm,NewDTREnable?SETDTR:CLRDTR);
        FDTREnable = NewDTREnable;
}
//---------------------------------------------------------------------------
//	FSetRTSEnable::RTSEnable属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetRTSEnable(bool NewRTSEnable)
{
        if (hComm ==0)
                return;

        EscapeCommFunction(hComm,NewRTSEnable?SETRTS:CLRRTS);
        FRTSEnable = NewRTSEnable;
}
//---------------------------------------------------------------------------
//	FSetXonLim::XonLim属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetXonLim(unsigned NewXonLim)
{
        if (NewXonLim == FXonLim)
                return;

        FXonLim = NewXonLim;

        if (hComm != 0)
                SetProperty();
}
//---------------------------------------------------------------------------
//	FSetXoffLim::XoffLim属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetXoffLim(unsigned NewXoffLim)
{
        if (NewXoffLim == FXoffLim)
                return;

        FXoffLim = NewXoffLim;

        if (hComm != 0)
                SetProperty();
}
//---------------------------------------------------------------------------
//	FSetParityReplace::ParityReplace属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetParityReplace(char NewParityReplace)
{
        if (NewParityReplace == FParityReplace)
                return;

        FParityReplace = NewParityReplace;

        if (hComm != 0)
                SetProperty();
}
//---------------------------------------------------------------------------
//	FSetXonChar::XonChar属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetXonChar(char NewXonChar)
{
        if (NewXonChar == FXonChar)
                return;

        FXonChar = NewXonChar;

        if (hComm != 0)
                SetProperty();
}
//---------------------------------------------------------------------------
//	FSetXoffChar::XoffChar属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetXoffChar(char NewXoffChar)
{
        if (NewXoffChar == FXoffChar)
                return;

        FXoffChar = NewXoffChar;

        if (hComm != 0)
                SetProperty();
}
//---------------------------------------------------------------------------
//	SendMsg::短信发送方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::SendMsg(String Phone,char far *Msg,long Size)
{
        if (hComm ==0)
                return;

        TCommBuff *SendBuff = new TCommBuff();

        SendBuff->Phone = Phone;
        SendBuff->FSetMsg(Msg,Size);

        WriteThread->SendMsg(SendBuff);
}
//---------------------------------------------------------------------------
//	SendMsg::本地发送方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::SendMsg(char far *Msg,long Size)
{
        if (hComm ==0)
                return;

        TCommBuff *SendBuff = new TCommBuff();

        SendBuff->FSetMsg(Msg,Size);

        WriteThread->SendMsg(SendBuff);
}
//---------------------------------------------------------------------------
//	FSetTimeOut::TimeOut属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetTimeOut(int NewTimeOut)
{
        ReadThread->FTimeOut = NewTimeOut;
}
//---------------------------------------------------------------------------
//	FGetTimeOut::TimeOut属性获取方法
//
//
//---------------------------------------------------------------------------
int __fastcall TTComm::FGetTimeOut(void)
{
        return ReadThread->FTimeOut;
}
//---------------------------------------------------------------------------
//	FSetIsLocal::IsLocal属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetIsLocal(bool NewIsLocal)
{
        ReadThread->FIsLocal = NewIsLocal;
}
//---------------------------------------------------------------------------
//	FGetIsLocal::IsLocal属性获取方法
//
//
//---------------------------------------------------------------------------
bool __fastcall TTComm::FGetIsLocal(void)
{
        return ReadThread->FIsLocal;
}
//---------------------------------------------------------------------------
//	CommWndProc::线程上发消息处理函数
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::CommWndProc(TMessage &msg)
{
        if (msg.Msg == WM_GETCOMMDATA) //接受数据消息
        {
                char Msg[1024]={'\0'};
                TCommBuff *ReadBuff = (TCommBuff *)msg.LParam;
                ReadBuff->FGetMsg(Msg,ReadBuff->Size);
                CommData(ReadBuff->Phone,Msg,ReadBuff->Size);
                delete ReadBuff;
        }
        if (msg.Msg == WM_SENDCOMMSTATE) //处理发送状态消息
        {
                SendState(msg.WParam);
        }
}
//---------------------------------------------------------------------------
//	CommData::OnCommData事件函数
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::CommData(String Phone,char far *Msg,long Size)
{
  if(lpCommData)
   {
     try
      {
        lpCommData(this,Phone, Msg, Size);
      }
     catch(...)
      {
        //do nothing (errors occurred on user's event)
      }
   }
}
//---------------------------------------------------------------------------
//	SendState::OnSendState事件函数
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::SendState(int SendState)
{
  if(lpSendState)
   {
     try
      {
        lpSendState(this,SendState);
      }
     catch(...)
      {
        //do nothing (errors occurred on user's event)
      }
   }
}
//---------------------------------------------------------------------------
//End of TTComm
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//Start of TReadThread
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
__fastcall TReadThread::TReadThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
        ReadQueue = new TQueue();
        //设置本地读取中断时间
        FTimeOut = 300;
        //是否是本地方式
        FIsLocal = true;

        PhoneNum = NULL;
        HaveMsg = false;
}
//---------------------------------------------------------------------------
//	~TReadThread::析构函数,释放建立的线程
//
//
//---------------------------------------------------------------------------
__fastcall TReadThread::~TReadThread(void)
{
        ReadQueue->~TQueue();
}
//---------------------------------------------------------------------------
//	Execute::线程Run函数
//
//
//---------------------------------------------------------------------------
void __fastcall TReadThread::Execute()
{
        char RxBuff[1024]={'\0'};
        COMSTAT cs;
        DWORD nBytesRead,dwEvent,dwError;

        while (!Terminated)
        {
                if (FIsLocal)
                {
                        ClearCommError(hComm,&dwError,&cs);
                        if (cs.cbInQue != 0)
                        {
                                Sleep(FTimeOut);
                                ClearCommError(hComm,&dwError,&cs);
                                ReadFile(hComm,RxBuff,cs.cbInQue,&nBytesRead,NULL);
                                TCommBuff *ReadBuff = new TCommBuff();
                                ReadBuff->FSetMsg(RxBuff,cs.cbInQue);
                                PostMessage( FHWnd, WM_GETCOMMDATA,0,LPARAM(ReadBuff) );
                        }
                        else Sleep(30);
                }
                else
                {
                        ClearCommError(hComm,&dwError,&cs);
                        if (cs.cbInQue != 0)
                        {
                                ReadFile(hComm,RxBuff,cs.cbInQue,&nBytesRead,NULL);
                                RxBuff[cs.cbInQue]='\0';
                                String Temp;
                                Temp.printf(RxBuff);

                                SMSBuff += Temp;
                        }

                        Byte FResult = FWaveCom();
                        if (FResult != 0x00)
                        {
                                if (FResult == 0x01)
                                {
                                        ::PulseEvent(sendEvent);
                                        PostMessage( FHWnd, WM_SENDCOMMSTATE,WPARAM(FResult),0);
                                }
                                if (FResult == 0x02)
                                {
                                        ::PulseEvent(sendEvent);
                                        PostMessage( FHWnd, WM_SENDCOMMSTATE,WPARAM(FResult),0);
                                }
                                if (FResult == 0x03)
                                {
                                        ::PulseEvent(okEvent);
                                }
                                if (FResult == 0x10)
                                {
                                        while (ReadQueue->Count() != 0)
                                        {
                                                TCommBuff *ReadBuff = (TCommBuff *)ReadQueue->Pop();
                                                PostMessage( FHWnd, WM_GETCOMMDATA,0,LPARAM(ReadBuff) );
                                        }
                                }
                        }
                        else Sleep(30);
                }
        }
}
//---------------------------------------------------------------------------
//	WaveCom::WaveCom调制解调器命令解析处理函数
//

⌨️ 快捷键说明

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