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

📄 modeocom.cpp

📁 modem串口接口,通过它可与方便与modem通信。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ModeoCom.cpp: implementation of the ModeoCom class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ModeoCom.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define DEBUG_TIME 0
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
static ModeoCom *m_runAPI;
#define MAX_COMMDAND_STR 9
static DWORD COMMAD_CODE[16]=    {0x0000007B,0x21212121,0x32323232,0x43434343};//命令串
static DWORD COMMAD_CODE_EX[16]= {0x0000008B,0x21212121,0x32323232,0x43434343};
static DWORD MOUSE_TABE[16]=     {0x0000009B,0x31313131,0x14141414,0x51515151};
static DWORD KEY_TABE[16]=       {0x000000AB,0x13131313,0x41414141,0x51515151};


static DWORD crc32_table_ex[256] = 
{
  0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
  0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
  0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
  0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
  0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
  0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
  0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
  0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
  0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
  0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
  0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
  0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
  0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
  0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
  0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
  0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
  0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
  0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
  0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
  0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
  0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
  0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
  0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
  0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
  0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
  0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
  0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
  0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
  0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
  0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
  0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
  0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
  0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
  0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
  0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
  0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
  0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
  0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
  0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
  0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
  0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
  0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
  0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
  0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
  0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
  0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
  0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
  0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
  0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
  0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
  0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
  0x2d02ef8dL
};

DWORD ModeoCom::GetCRC32(BYTE * databuf,DWORD len)
{

    DWORD temp;
    DWORD oldcrc=0xffffffff;
	while(len--){
		temp = (oldcrc ^(*databuf++)) & 0x000000FF;
		oldcrc  = (( oldcrc >> 8) & 0x00FFFFFF) ^ crc32_table_ex[temp];
    }
	return ~oldcrc; 
}

void FenTxRxSpeek(char *ip,long ln,DWORD &R,DWORD &T)//分析串
{
	//“CONNECT 115200/V34/LAPM/V42BIS/33600:TX/33600:RX”
	R=0;
	T=0;
	int n,k;
	BYTE ch;
	for(k=0;k<ln;k++)
	{
		if(memcmp(&ip[k],":TX",3)==0)
		{
			n=k;
			n--;
			for(;n>=0;n--)
			{
				ch=(BYTE)ip[n];
				if(ch<'0' || ch>'9')
				{
					T=atoi(&ip[n+1]);
					break;
				}
			}
		}
		if(memcmp(&ip[k],":RX",3)==0)
		{
			n=k;
			n--;
			for(;n>=0;n--)
			{
				ch=(BYTE)ip[n];
				if(ch<'0' || ch>'9')
				{
					R=atoi(&ip[n+1]);
					break;
				}
			}
		}
	}

	if(R==0)
	{
		for(k=0;k<ln;k++)
		{
			if(memcmp(&ip[k],"CONNECT",7)==0)
			{
				R=atoi(&ip[k+8]);
				break;
			}
		}
	}
}
static char End_code[MAX_COMMDAND_STR][16]=
{
	"CONNECT",//0、已连接
	"OK",//1、OK
	"RING",//2、来电
	"NO CARRIER",//3、丢失或未检测到载波 
	"ERROR",//4、错误
	"NO DIALTONE",//5、未检测到拨号音 
	"BUSY",//6、检测到忙音 
	"NO ANSWER",//7、无静音应答 
	"DELAYED",//8、所拨的号码已延迟 
};

DWORD WINAPI SouProF(void *vp)
{
	if(m_runAPI==NULL) return 0;
	m_runAPI->Run();
	return 0;
}

ModeoCom::ModeoCom()
{
	m_runAPI=NULL;
	hCom=NULL;
	S_Event=NULL;
	m_buf=new BYTE[65536];
	R_buf=new BYTE[65536];
	S_buf=new BYTE[65536];
	R_ln=0;
	m_Input=0;
	m_out=0;
	RThread=NULL;
	m_Rx=0;
	memset(&m_OverlappedWrite,0,sizeof(OVERLAPPED));
	memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));
	memset(&m_OverlappedWaite,0,sizeof(OVERLAPPED));
	memset(Err_code,0,128);
	R_Waite_Event=NULL;//用于上层查询低层数据到达
    R_Message_Event=NULL;
	Read_Event=NULL;
	m_ln=0;
	memset(command_str,0,128);
	memset(command_ok,0,128);
	for(int k=0;k<MAX_COMMDAND_STR;k++) str_ln[k]=strlen(End_code[k]);
	m_NEW=FALSE;
	memset(command,0,64);
	command_ln=0;
	AUTO_MAC=FALSE;
	RING_COUNT=0;
	RING_TIME=2;
	m_Tall_time=0;
	num=0;//有多少个电话
	memset(MAC_th,0,32*32);
	m_Link=FALSE;
	m_hWnd=NULL;
	m_Ring_time=0;
	m_End_CodeEx=128;
	m_End_Code=128;
	hMutex=NULL;
	OPEN=0;
	DATA_MAC=0;
	m_LINK_OK=FALSE;
	R_time=0;
	m_FILE_OPEN=FALSE;
	wMutex=NULL;
}

ModeoCom::~ModeoCom()
{
	Close();
	if(m_buf!=NULL) delete m_buf;
	if(R_buf!=NULL) delete R_buf;
	if(S_buf!=NULL) delete S_buf;
	m_buf=NULL;
	R_buf=NULL;
	S_buf=NULL;
	if(OPEN==16) m_fp.Close();
}

void ModeoCom::Close()
{
	if(RThread!=NULL)//如果线程正在运行,则关门它
	{
	   ::TerminateThread(RThread,0);
	   RThread=NULL;
	   Sleep(500);
	}
	if(hCom!=NULL)    ::CloseHandle(hCom);
	if(S_Event!=NULL) ::CloseHandle(S_Event);
	if(m_OverlappedWrite.hEvent!=NULL) ::CloseHandle(m_OverlappedWrite.hEvent);
	m_OverlappedWrite.hEvent=NULL;
	if(m_OverlappedRead.hEvent!=NULL) ::CloseHandle(m_OverlappedRead.hEvent);
	m_OverlappedRead.hEvent=NULL;
	if(m_OverlappedWaite.hEvent!=NULL) ::CloseHandle(m_OverlappedWaite.hEvent);
	if(R_Waite_Event!=NULL) ::CloseHandle(R_Waite_Event);
	if(R_Message_Event!=NULL) ::CloseHandle(R_Message_Event);
	if(Read_Event!=NULL) ::CloseHandle(Read_Event);
    if(hMutex==NULL)CloseHandle(hMutex);
	if(wMutex!=NULL) CloseHandle(wMutex);
	wMutex=NULL;
	R_Waite_Event=NULL;//用于上层查询低层数据到达
    R_Message_Event=NULL;
	m_OverlappedWaite.hEvent=NULL;
	hCom=NULL;
	S_Event=NULL;
	Read_Event=NULL;
	hMutex=NULL;
}
BOOL ModeoCom::OpenCom(char * con_name, DWORD speek)
{
	COMMTIMEOUTS CommTimeOuts ; //定义超时结构,并填写该结构 
	DCB dcb;//
	DWORD m_ID,lRe;
	Close();//首先清除上次操作
	hCom=::CreateFile(con_name,GENERIC_READ|GENERIC_WRITE,//允许收发
		0,
		NULL,
		OPEN_EXISTING,
	    FILE_FLAG_OVERLAPPED|FILE_ATTRIBUTE_NORMAL, //使用异步通信 
		NULL);
	if(hCom==NULL||hCom==(void*)0xffffffff) 
	{
		strcpy(Err_code,"无法创建通信口");
		return(FALSE);
	}
	SetCommMask(hCom, EV_RXCHAR|EV_BREAK);//设置事件驱动的类型
	if(!SetupComm( hCom,4096,4096))
	{
		strcpy(Err_code,"设置通信缓冲区尺寸时出错");
		Close();
		return FALSE; //设置输入、输出缓冲区的大小
	}
	memset(&CommTimeOuts,0,sizeof(COMMTIMEOUTS));
	CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
	CommTimeOuts.ReadTotalTimeoutMultiplier=10;
	CommTimeOuts.ReadTotalTimeoutConstant=10;
	CommTimeOuts.WriteTotalTimeoutMultiplier=10;
	CommTimeOuts.WriteTotalTimeoutConstant=50;
	if(!SetCommTimeouts( hCom, &CommTimeOuts ))
	{
		strcpy(Err_code,"设置通信操作超时结构时出错");
		Close();
		return FALSE;//设置读写操作所允许的超时
	}
	GetCommState(hCom, &dcb ) ; //读串口原来的参数设置 
	dcb.BaudRate =speek;//2400;//300bpi
	dcb.ByteSize =8;
	dcb.Parity = NOPARITY;//
	dcb.StopBits = ONESTOPBIT;
	dcb.fBinary = TRUE ;
	dcb.fParity = FALSE; 
	if(!SetCommState(hCom, &dcb )) 
	{
		strcpy(Err_code,"设置通信参数时出错");
		Close();
		return FALSE;
	}
	PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR 
		|PURGE_RXCLEAR ); //清干净输入、输出缓冲区 
	
	memset(&m_OverlappedWrite,0,sizeof(OVERLAPPED));
	memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));
	memset(&m_OverlappedWaite,0,sizeof(OVERLAPPED));
	m_OverlappedWrite.hEvent =CreateEvent(NULL,TRUE,TRUE,NULL);
	m_OverlappedRead .hEvent =CreateEvent(NULL,TRUE,TRUE,NULL);
	m_OverlappedWaite .hEvent =CreateEvent(NULL,TRUE,TRUE,NULL);

	R_Waite_Event=CreateEvent(NULL,TRUE,TRUE,NULL);;//用于上层查询低层数据到达
    R_Message_Event=CreateEvent(NULL,TRUE,TRUE,NULL);
	Read_Event=CreateEvent(NULL,TRUE,TRUE,NULL);

	wMutex=CreateMutex(NULL,FALSE,"MODEM_SEND_Mutex");

	::ResetEvent(R_Waite_Event);
	::ResetEvent(R_Message_Event);

	m_ln=0;
	m_runAPI=this;
	RThread=CreateThread(NULL,0,SouProF,&lRe,0,&m_ID);//创建一个服务线程
	if(m_OverlappedWrite.hEvent==NULL ||
		m_OverlappedRead.hEvent==NULL ||
		m_OverlappedWaite.hEvent==NULL||
		RThread==NULL)
	{
		strcpy(Err_code,"无法启动各项异步接口函数");
		Close();
		return FALSE;
	}
	m_Rx=0;//清除数据收发量
	m_Tx=0;//
	return TRUE;
}

DWORD ModeoCom::ReadRun(DWORD waitetime)//请求上级调用
{
	DWORD dwEvtMask=0 ;
	WaitCommEvent( hCom, &dwEvtMask, &m_OverlappedWaite );
	if (WaitForSingleObject(m_OverlappedWaite.hEvent, 0xFFFFFFFF))return COM_ERROR;
	::ResetEvent(m_OverlappedWaite.hEvent);
	if(dwEvtMask & EV_TXEMPTY) if(S_Event!=NULL) ::SetEvent(S_Event);
	if(dwEvtMask & EV_RXCHAR)  return RX_DATA;//有数据到达
	if(dwEvtMask & EV_BREAK)
	{
		SaveData("***COM信号变化***");
		if(m_hWnd!=NULL)::PostMessage(m_hWnd,RING_COM,16,0);
	}
	return COM_ERROR;
}

DWORD ModeoCom::GetRvcLength(void) //输入缓冲区有多少数据?
{
	COMSTAT ComStat ;
	DWORD dwErrorFlags;; 
	memset(&ComStat,0,sizeof(COMSTAT));
	ComStat.cbInQue=0;
	dwErrorFlags=0;
	ClearCommError(hCom, &dwErrorFlags, &ComStat ) ; 
	return ComStat.cbInQue ; 
}

long ModeoCom::RxData(void * lpData, DWORD ln)//读数据
{
	DWORD dwLength=0;
	m_OverlappedRead.InternalHigh=0;
	m_OverlappedRead.Internal=0;
	m_OverlappedRead.Offset=0;
	m_OverlappedRead.OffsetHigh=0;
	::ReadFile( hCom,lpData,ln,&dwLength,&m_OverlappedRead);
	if (WaitForSingleObject(m_OverlappedRead.hEvent, 5000))return dwLength;
	::ResetEvent(m_OverlappedRead.hEvent);
	m_Rx+=dwLength;
	return dwLength;
}

long ModeoCom::TxData(void * lpData, DWORD ln)//发送数数据
{
	DWORD dwBytesWritten;
	Lock();
	dwBytesWritten=0;
	m_OverlappedWrite.InternalHigh=0;
	m_OverlappedWrite.Internal=0;
	m_OverlappedWrite.Offset=0;
	m_OverlappedWrite.OffsetHigh=0;
	WriteFile(hCom,lpData,ln,&dwBytesWritten,&m_OverlappedWrite);
	if (WaitForSingleObject(m_OverlappedWrite.hEvent,5000))
	{
		UnLock();
		return 0;
	}
	::ResetEvent(m_OverlappedWrite.hEvent);
	dwBytesWritten=m_OverlappedWrite.InternalHigh;
	m_Tx+=dwBytesWritten;
	UnLock();
	return dwBytesWritten;
}




void ModeoCom::Run()
{
	long rd,k;
	R_ln=0;
	ClsLastTimeData();//清除过时的数据
	while(1)
	{
		if(ReadRun(0)==1)
		{
			
			do
			{
				rd=GetRvcLength();
				if(rd>0)
				{
					m_Tall_time=GetTickCount();
					if(R_ln>65535) R_ln=0;
					k=65535-R_ln;
					if(k>rd) k=rd;
					k=RxData(&R_buf[R_ln],k);
					if(k>0) R_ln+=k;
					R_buf[R_ln]=0;
				}

			}while(rd>0);
		}
		
	}
}

void ModeoCom::ClsLastTimeData()
{
	R_ln=0;

	

}
void ModeoCom::ReadEx()
{
	int n,k;
	do
	{
		Sleep(100);
		n=GetRvcLength();
		if(n>0)
		{
			m_Tall_time=GetTickCount();
			if(R_ln>65535) R_ln=0;
			k=65535-R_ln;
			if(k>n) k=n;
			k=RxData(&R_buf[R_ln],k);
			if(k>0) R_ln+=k;
			R_buf[R_ln]=0;
		}
		
	}while(n>0);
				
}
void ModeoCom::ReadPro()
{
	WORD ls;
	long lx;
	int k,n,x;
	k=0;
	ls=0;
	while(R_ln>3 && k<R_ln)
	{
STATE_OPP:
		
		if(*(DWORD*)&R_buf[k]==0xBABABABA)//表明对方要送一个长包过来
		{
			lx=*(WORD*)&R_buf[k+4];
			ls=*(WORD*)&R_buf[k+6];
			if(m_ln<16) sou_speek_ln=GetTickCount();

			if(GetTickCount()-R_time>1000 && ls>4096)
			{
				if(m_hWnd!=NULL && DATA_MAC!=0)
					::PostMessage(m_hWnd,DATA_MAC+12,m_ln,ls);//来电显示
				R_time=GetTickCount();
			}

			if((R_ln-k)>=(lx+16))
			{
				m_Tall_time=0;

				if(GetCRC32(&R_buf[16+k],lx)!=*(DWORD*)&R_buf[k+8])
				{
					R_ln=0;
					*(DWORD*)S_buf_ex=0xABABABAA;
					TxData(S_buf_ex,4);//回发数据错误CRC错
					return;
				}

				if(m_Blck_time==*(DWORD*)&R_buf[k+12])
				{   //数据已收到了并且处理过了
					R_ln=0;
					*(DWORD*)S_buf_ex=0xABABABAB;
					TxData(S_buf_ex,4);//回发应答码
					return;
				}
				else
				{
					m_Blck_time=*(DWORD*)&R_buf[k+12];
					if(m_ln+lx<65000)
					{
						memcpy(&m_buf[m_ln],&R_buf[k+16],lx);
						m_ln+=lx;
						R_ln=0;
						*(DWORD*)S_buf_ex=0xABABABAB;
						TxData(S_buf_ex,4);//回发应答码
						if(m_ln>=ls)
						{
							if(m_hWnd!=NULL && DATA_MAC!=0)
								::PostMessage(m_hWnd,DATA_MAC,0,0);//来电显示
							WaiteRead();
						}
						return;
					}
					else
					{
						R_ln=0;
						*(DWORD*)S_buf_ex=0xABABABAA;
						TxData(S_buf_ex,4);//回发数据错误
						return;
					}
				}
			}
			else
			{
				return;
			}
			return;
		}

		if(*(DWORD*)&R_buf[k]==0xABABABAB && (R_ln-k)>=4)//系统应答码
		{
			m_Tall_time=0;
			Full(4+k);
			m_Code=1;//应答码
			k=0;
			if(Read_Event!=NULL) ::SetEvent(Read_Event);
			if(R_ln==0) return;
			
		}
		
		if(*(DWORD*)&R_buf[k]==0xABABABAA && (R_ln-k)>=4)//系统应答码
		{
			m_Tall_time=0;
			Full(4+k);
			m_Code=2;//应答码
			k=0;
			if(Read_Event!=NULL) ::SetEvent(Read_Event);
			if(R_ln==0) return;
			
			
		}
		if(*(DWORD*)&R_buf[k]==0xBFBCBEB9) 
		{
			if(!RxFile(0,&R_buf[k])) return;
			k=0;
			
		}

		k++;
	}

    if(FindThDataMac()) return;//如果有来电显示

	for(k=0;k<R_ln;k++)
	{
		for(n=0;n<MAX_COMMDAND_STR;n++)
		{
			if(memcmp(&R_buf[k],End_code[n],str_ln[n])==0)
			{
				ReadEx();

				m_Tall_time=0;
				m_End_Code=n;
				m_End_CodeEx=n;
				for(;k>=0;k--) if(R_buf[k]>127) break;
				if(k<0) k=0;
				x=strlen((char*)&R_buf[k]);
				if(x<128) strcpy(command_str,(char*)&R_buf[k]);
				R_ln=0;
				m_ln=0;
				x=strlen(command_str);
				for(lx=0;lx<x;lx++) if((BYTE)command_str[lx]<27) command_str[lx]=' ';
				SaveData(command_str);
				m_NEW=TRUE;
				if(n==0)FenTxRxSpeek(command_str,strlen(command_str),m_RxSeek,m_TxSeek);
				return;
			}
		}
	}

}


void ModeoCom::Full(int lx)
{
	int n;
	int k;
	n=R_ln-lx;
	for(k=0;k<n;k++) R_buf[k]=R_buf[k+lx];
	if(R_ln>lx) R_ln-=lx;
	else R_ln=0;
}

BOOL ModeoCom::Waite(DWORD tx)
{
	Sleep(0);//切换线程
	if(m_Code==1) return TRUE;
	if(m_Code==2) return FALSE;
	DWORD tr=GetTickCount();
	while(GetTickCount()-tr<tx+DEBUG_TIME)
	{
		if(m_Code==1) return TRUE;
		if(m_Code==2) return FALSE;
		if(Read_Event!=NULL)
		{
			::WaitForSingleObject(Read_Event,1000);
			::ResetEvent(Read_Event);
		}
		if(m_Code==1) return TRUE;
		if(m_Code==2) return FALSE;
	}
	return FALSE;
}

//***注意,上级线程应调用该函数,测试有没有数据到过,典型应用为
//  
//  while(TestDataRx())
//	{ 
//    Read();
//    对读出的数据进行处理
//  }

BOOL ModeoCom::TestDataRx(DWORD wait)//有数据到达吗?如果没有数据,则一直等待
{
	if(R_Message_Event==NULL) return FALSE;
	if(WaitForSingleObject(R_Message_Event,wait)) return FALSE;
	::ResetEvent(R_Message_Event);
	return TRUE;
}
void ModeoCom::WaiteRead()
{

⌨️ 快捷键说明

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