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

📄 carditfa.cpp.bak

📁 一个vxworks开发的snmp的程序
💻 BAK
📖 第 1 页 / 共 3 页
字号:
// CardItfa.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "CardItfa.h"
#include "CBuffer.h"

#include <conio.h>
#include <winioctl.h>
#include <math.h>

#include "WINSOCK2.H"

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

/******************************************************/
#define RESET_ADDR      1            //复位端口地址	
#define MAX_FIFO_LEN    1023        //最大FIFO长度
#define SYNC_CODE       0x5A        //同步码
#define DATA_FLAG       0x01        //数据块标志
#define INS_FLAG        0x00        //指令块标志

#define  SET_BIT(x,b)       ((x)|=(1<<(b)))
#define  CLEAR_BIT(x,b)     ((x)&=~(1<<(b)))
//#define  MAX_BUFF_SIZE      2048
#define  MAXBUFFSEND		2056
#define  MAXBUFFRECV		20480
#define  MAX_FRA_LEN        256
//#define  inc(k) if(k<MAX_BUFF_SIZE-1) k=k+1;else k=0
#define  inc_sd(k) if(k<MAXBUFFSEND-1) k++;else k=0
#define  inc_rv(k) if(k<MAXBUFFRECV-1) k++;else k=0
//#define  inc(k) k++;k &= 0x7ff

//-----------------------------------------------------------
//#define ETHDATASIZE		1200

#define BUFDATASIZE		1200
#define BUFRECVDATANUM		16
//#define BUFSENDDATANUM	4

#define BUFCMDSIZE		70
#define BUFRECVSYNCMDNUM	8
#define BUFRECVASYCMDNUM	32
//#define BUFSENDCMDNUM		4
//-----------------------------------------------------------
//全局变量定义
CBuffer * pBufDataRecv = 0, *pBufDataSend = 0,
	*pBufSynCmdRecv = 0, *pBufAsyCmdRecv = 0, *pBufCmdSend = 0;//各种缓冲区
char ThreadCtlCode; //0:强制停止,-1:已经停止;1:允许开始
char bBeRun = 0;
WSAEVENT hEvent[2];//hEvent[0]用于通知可接收,hEvent[1]用于中止接收阻塞
SOCKET sClient = 0;	/* socket fd's */
STRUCT_ERROR strError;
//-----------------------------------------------------------

BEGIN_MESSAGE_MAP(CCardItfaApp, CWinApp)
	//{{AFX_MSG_MAP(CCardItfaApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCardItfaApp construction

CCardItfaApp::CCardItfaApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CCardItfaApp object

CCardItfaApp theApp;

UINT ThreadProc(LPVOID pParam)

{
//	ThreadCtlCode = 1;
//	BOOL bNewFrame = 1;//1 表示本包是是新的一帧的开始,0 表示本包为接上一包为一帧的一部分
	BOOL Rtn = 1;
	unsigned char temp[1536];
	unsigned int nLength;
	while(ThreadCtlCode > 0)
	{		
		if((WSAWaitForMultipleEvents(2,hEvent,FALSE,WSA_INFINITE,FALSE) - WSA_WAIT_EVENT_0) == 0)
		{
			if(recv(sClient,temp,1536,0) == 0)
			{
				Rtn = 0;
				break;
			}
			if(temp[0] == 0x05)//Data
			{//处理多包组帧
				if(bNewFrame)//如果本包为新帧的开始
				{					
					if()
					{
						if((pBufDataRecv->Append()))
					}
				}
				nLength = temp[2];
				nLength <<= 8;
				nLength += (temp[3] + 4);
				if((pBufDataRecv->PutTo(temp,nLength)) == 0)
					strError.DataRecvOver ++;
			}else if(temp[0] == 0x04)//上行指令
			{
				if(temp[4] == 0x80)//AsyCmd
				{
					if((pBufAsyCmdRecv->PutTo(temp,BUFCMDSIZE)) == 0)					
						strError.AsyCmdRecvOver ++;
				}else				//SynCmd
				{
					if((pBufSynCmdRecv->PutTo(temp,BUFCMDSIZE)) == 0)					
						strError.SynCmdRecvOver ++;
				}
			}
		}
	}
	ThreadCtlCode = -1;
	if(Rtn == 0)
	{
		CloseCard();
		return 0;
	}
	
	return 1;
}


/* InitCard() : 初始化底层接口库 */
BOOL WINAPI InitCard(char * ServerAddr, int Port, char * Name, char * Passwd)
{  
	//如果重复调用,则先停止底层
	if(bBeRun)
	{
		if(CloseCard() == FALSE)
			return FALSE;
	}

	//初始化socket
	WSADATA wsd;
	if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
	{
		//Fail to load winsock
		return FALSE;
	}
	char str;
	
	//建立socket连接

    struct sockaddr_in	serverAddr;	/* server's address */
	struct hostent *host = NULL;
    int	client_len;	/* length of clientAddr */
    unsigned char chData[256], i,DataLen;
	unsigned char * data;	
	char taskname[16];
	char bWriteStatus;

    /* Zero out the sock_addr structures.
     * This MUST be done before the socket calls.
     */

    memset(&serverAddr, 0, sizeof (serverAddr));    

    /* Open the socket.
     * Use ARPA Internet address format and stream sockets.
     */

    sClient = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (sClient == INVALID_SOCKET)
		return FALSE;

    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr(ServerAddr);
	serverAddr.sin_port = htons(Port);	
	if(connect(sClient,(struct sockaddr *)&serverAddr,
		sizeof(serverAddr)) == SOCKET_ERROR)
	{
		return FALSE;
	}
	//版本协商和身份验证
	//构造发送数据,验证通过以后继续下一步

	hSockEvent = WSACreateEvent();
	unsigned char Message[64];
	if(pBufDataRecv == 0)
		pBufDataRecv = new class CBuffer(BUFDATASIZE,BUFRECVDATANUM,TRUE);
	if(pBufDataSend == 0)
		pBufDataSend = new class CBuffer(BUFDATASIZE,BUFSENDDATANUM,TRUE);
	if(pBufSynCmdRecv == 0)
		pBufSynCmdRecv = new class CBuffer(BUFCMDSIZE,BUFRECVSYNCMDNUM,TRUE);
	if(pBufAsyCmdRecv == 0)
		pBufAsyCmdRecv = new class CBuffer(BUFCMDSIZE,BUFRECVASYCMDNUM,TRUE);
	if(pBufCmdSend == 0)
		pBufCmdSend = new class CBuffer(BUFCMDSIZEDEFAULT,BUFSENDCMDNUM,TRUE);

	ThreadCtlCode = 1;
	AfxBeginThread(ThreadProc,&str);

	WSAEventSelect(sClient,hSockEvent,FD_READ | FD_CLOSE);

	bBeRun = 1;//标志底层开始工作
	return TRUE;
}



BOOL WINAPI CloseCard()           //stop the process(MyThreadProc)         
{
	char trynums = 0;
	if(ThreadCtlCode > 0)	//if running
	{
		ThreadCtlCode = 0;	//stop running
		do{
			Sleep(50);
			trynums++;
		}
		while((ThreadCtlCode == -1)&&(trynums<20));//等待线程终止
	}
	if(ThreadCtlCode > 0)
		return FALSE;
	
	if(pBufDataRecv){delete(pBufDataRecv); pBufDataRecv = 0;}
	if(pBufDataSend){delete(pBufDataSend); pBufDataSend = 0;}
	if(pBufSynCmdRecv){delete(pBufSynCmdRecv); pBufSynCmdRecv = 0;}
	if(pBufAsyCmdRecv){delete(pBufAsyCmdRecv); pBufAsyCmdRecv = 0;}
	if(pBufCmdSend){delete(pBufCmdSend); pBufCmdSend = 0;}

	if(sClient){closesocket(sClient); sClient = 0;}
	WSACleanup();
	bBeRun = 0;
	return TRUE;
}

UINT WINAPI Reset302()
{
	return TRUE;
}


/**************** writedata()--写入模块****************
unsigned char *buff    待写入内容
int buff_len           待写入内容长度
********************************************************/
BOOL writedata(unsigned char *buff,int buff_len)//一次写入一串
{
    int i = 0;
	int trynums=0;
    
	if(buff_len<=0) return TRUE;
    while(txbuf_space_left<buff_len && trynums<3)
	{
		Sleep(10);
		trynums++;
	}

	if(trynums>=3) return FALSE;

	::WaitForSingleObject(hMutex_sd,1000);
	for(i=0;i<buff_len;i++)
	{ 
//		if( txbuf_space_left<=0)//tx_buf_end != tx_buf_head)
//		{
//			trynums=0;
//			do
//			{  Sleep(10);
//			   trynums++;
//			}while(txbuf_space_left<=0 );//&& trynums<10);

//			if(trynums>=10)
//				return FALSE;
//		}
		
        tx_buff[tx_buf_end]=*(buff+i);
	   
        inc_sd(tx_buf_end);
	    txbuf_space_left--;
	}
	::ReleaseMutex(hMutex_sd);
	
	return TRUE;

}


/************WriteCard()--写数据****************************
data: 要写入数据
Len :写入数据字节数
***********************************************************/
BOOL WINAPI WriteCard(unsigned char* data,int ByteLen)
{   
	
	unsigned char buff[2056];
    int i = 0;
	int buff_len=0;
	BOOL Flag;
    
	buff[0]=SYNC_CODE;
	buff[1]=SYNC_CODE;
    buff[2]=SYNC_CODE;    
	buff[3]=SYNC_CODE;

    buff[4]=DATA_FLAG;
	buff[5]=0x00;

	buff[7]=(unsigned char)(ByteLen & 0x00FF);
	buff[6]=(unsigned char)((ByteLen>>8) & 0x00FF);

	if(ByteLen > 2048) return FALSE;
	memcpy(&buff[8],data,ByteLen);
/*	for(i=0;i<ByteLen;i++)
		buff[8+i]=*(data+i);
*/
	buff_len=ByteLen+8;
	
	Flag=writedata(buff,buff_len);
	
	return Flag;

}

/************SetInterface()--设置接口类型******************
interfacetype: 要写入的接口类型
***********************************************************/
BOOL WINAPI SetInterface(int interfacetype)
{
	unsigned char buff[100];
    int i = 0;
	int buff_len=0;
	BOOL Flag;
    
	memset(buff,SYNC_CODE,4);
//	buff[0]=SYNC_CODE;
//	buff[1]=SYNC_CODE;
//	buff[2]=SYNC_CODE;    
//	buff[3]=SYNC_CODE;

    buff[4]=INS_FLAG;
	buff[5]=0x00;

	buff[6]=0x00;
	buff[7]=0x01;

	memset(&buff[8],0,64);
//	for(i=0;i<64;i++)
//		buff[i+8]=0;

	buff[72]=0x80;
	buff[73]=interfacetype;
	

	buff_len=74;
	
	Flag=writedata(buff,buff_len);
	
	return Flag;
}

/************SetProtocol()--设置协议类型******************
protocol: 要写入的协议类型
***********************************************************/
BOOL WINAPI SetProtocol(int protocol)
{
    
	unsigned char buff[100];
    int i = 0;
	int buff_len=0;
	BOOL Flag;
    
	memset(buff,SYNC_CODE,4);
//	buff[0]=SYNC_CODE;
//	buff[1]=SYNC_CODE;
//	buff[2]=SYNC_CODE;    
//	buff[3]=SYNC_CODE;

    buff[4]=INS_FLAG;
	buff[5]=0x00;

	buff[6]=0x00;
	buff[7]=0x01;
	
	memset(&buff[8],0,64);
//	for(i=0;i<64;i++)
//		buff[i+8]=0;

	buff[72]=0x81;
	buff[73]=protocol;
	

	buff_len=74;
	
	Flag=writedata(buff,buff_len);
	Sleep(50);
	
	return Flag;
}

/************SetMode()--设置mc68302运行模式****************
mode: 要写入的运行模式
***********************************************************/
BOOL WINAPI SetMode(int mode)
{
    unsigned char buff[100];
    int i = 0;
	int buff_len=0;
	BOOL Flag;
    
	memset(buff,SYNC_CODE,4);
//	buff[0]=SYNC_CODE;
//	buff[1]=SYNC_CODE;
//	buff[2]=SYNC_CODE;    
//	buff[3]=SYNC_CODE;

    buff[4]=INS_FLAG;
	buff[5]=0x00;

	buff[6]=0x00;
	buff[7]=0x01;
	
	memset(&buff[8],0,64);
	//for(i=0;i<64;i++)
	//	buff[i+8]=0;

	buff[72]=0x82;
	buff[73]=mode;
	
	buff_len=74;
	
	Flag=writedata(buff,buff_len);
	
	return Flag;
}

/************SetCode()--设置编码类型******************
codetype: 要写入的编码方式
***********************************************************/
/************SetAppMode()--设置误码率测试或者模拟DCECTE******************
appmode: 要设置的模式	0:正常   1:误码
***********************************************************/
BOOL WINAPI SetAppMode(int appmode)
{
    unsigned char buff[100];
    int i = 0;
	int buff_len=0;
	BOOL Flag;
    
	memset(buff,SYNC_CODE,4);

//	buff[0]=SYNC_CODE;
//	buff[1]=SYNC_CODE;
//	buff[2]=SYNC_CODE;    
//	buff[3]=SYNC_CODE;

    buff[4]=INS_FLAG;
	buff[5]=0x00;

	buff[6]=0x00;
	buff[7]=0x01;
	memset(&buff[8],0,64);
//	for(i=0;i<64;i++)
//		buff[i+8]=0;

	buff[72]=0x83;
	buff[73]=appmode;
	
	buff_len=74;
	
	Flag=writedata(buff,buff_len);
	
	return Flag;
}

/*******************SetItfa()--设置接口状态*******************
ISignal:将设置的参数,对应为0:表示不处理,1:表示置位,2:表示清位
**************************************************************/
BOOL WINAPI SetItfaState(ItfaState ISignal)
{
	int SetIns_Byte=0;
	int ClrIns_Byte=0;
	int Ins_nums=0;
	BOOL Flag;

	unsigned char buff[100];
    int i = 0;
	int buff_len=0;
	
	if(ISignal.CTS==2)
		ClrIns_Byte=ClrIns_Byte | 0x01;
	if(ISignal.CTS==1)

⌨️ 快捷键说明

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