📄 tcomm.cpp
字号:
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 + -