?? modeocom.cpp
字號:
// 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 + -