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

📄 5112udp.c

📁 一个嵌入式系统通过GPRS进行数据传输的程序,协议芯片为5112,程序中描述了通过单片机上网及通过UDP数据传输的过程
💻 C
📖 第 1 页 / 共 4 页
字号:
//DESCRIPTION: send link test data
//CALL:
//INPUT:
//OUTPUT:
//
///////////////////////////////
void sendchk(void)
{
	unsigned char *p;
	unsigned char  addr,i;
	unsigned int  chk;
	send_ctr_com0_buf[0]=0x7e;
	send_ctr_com0_buf[1]=0x35;
	send_ctr_com0_buf[2]=0x00;
	send_ctr_com0_buf[3]=0x11;
	send_ctr_com0_buf[4]=0x55;
	send_ctr_com0_buf[5]=0x00;
	send_ctr_com0_buf[6]=0x00;
	send_ctr_com0_buf[7]=0x05;
	p=conver(eid);//conver eid
	for ( i = 0 ; i < p[0] ; i++ ) send_ctr_com0_buf[8+i]=p[i+1];
	addr=8+p[0];
	chk=p[(p[0]+1)];
	chk=chk<<8;
	chk=chk+p[(p[0]+2)];
	send_ctr_com0_buf[addr]=0x01;
	chk++;
	addr++;
	p=conver(chk);//conver chk
	for( i = 0 ; i < p[0] ; i++ )
	{
		send_ctr_com0_buf[addr]=p[i+1];
		addr++;
	}
	send_ctr_com0_buf[addr]=0x55;
	addr++;
	send_ctr_com0_buf[addr]=0x7e;
	addr++;
	send_data0=0;
	send_ctr_com0_len=addr;
	send_com0_cnt=0;
	send_com0_finish=0;
	TI=1;
	ack=0;
	settimer(9);
	while ( !ack )
	{
	;
	}
	killtimer(9);
	ack=0;
}
///////////////////////////////
//
//NAME: resetconnect
//DESCRIPTION: close socket and re-set socket set
//CALL:
//INPUT:
//OUTPUT:
//
///////////////////////////////
void resetconnect(void)
{
//	unsigned char  temp;
//	unsigned char *p;
	send_ctr_com0_buf[0]=0x7e;
	send_ctr_com0_buf[1]=0x31;
	send_ctr_com0_buf[2]=0x00;
	send_ctr_com0_buf[3]=0x04;
	send_ctr_com0_buf[4]=0x0c;
	send_ctr_com0_buf[5]=0x7e;
	send_data0=0;
	send_ctr_com0_len=6;
	send_com0_cnt=0;
	send_com0_finish=0;
	TI=1;
	ack=0;
	settimer(9);
	while ( !ack )
	{
	;
	}
	killtimer(9);
	send_ctr_com0_buf[0]=0x7e;
	send_ctr_com0_buf[1]=0x33;
	send_ctr_com0_buf[2]=0x00;
	send_ctr_com0_buf[3]=0x0b;
	send_ctr_com0_buf[4]=0x1f;//my port = 8000
	send_ctr_com0_buf[5]=0x40;
	send_ctr_com0_buf[6]=sockset[0];
	send_ctr_com0_buf[7]=sockset[1];
	send_ctr_com0_buf[8]=sockset[2];
	send_ctr_com0_buf[9]=sockset[3];
	send_ctr_com0_buf[10]=sockset[4];
	send_ctr_com0_buf[11]=sockset[5];
	send_ctr_com0_buf[12]=0x7e;
	ack=0;
	send_data0=0;
	send_ctr_com0_len=13;
	send_com0_cnt=0;
	send_com0_finish=0;
	TI=1;						//set socket
	settimer(9);
	while ( !ack )
	{
	;
	}
	killtimer(9);
	ack=0;
}
///////////////////////////////
//
//NAME: conver
//DESCRIPTION: conver chk or send id or eid from unsigned int to send format
//CALL:
//INPUT:
//OUTPUT:*p[0]=data len,p[1~len]=data,p[len+1,+2]=add
//
///////////////////////////////
unsigned char * conver(unsigned int dt)
{
	unsigned char *p;
	unsigned char data convbuf[9];
	unsigned char data ch,addr,s55;
	unsigned int chk;
	ch=(unsigned char )(dt & 0xff);
	s55=0;
	chk=0;
	if (( ch == 0x55 )|( ch == 0x56 ))
	{
		convbuf[5]=0x56;
		chk=0x56;
		convbuf[6]=ch ^ 0x20;
		chk=chk+convbuf[6];
		addr=4;
		s55++;
	}
	else
	{	chk=ch;
		if (( ch == 0x7d )|( ch == 0x7e ))
		{
			convbuf[5]=0x7d;
			convbuf[6]=ch ^ 0x20;
			addr=4;
		}
		else
		{
			convbuf[6]=ch;
			addr=5;
		}
	}
	ch=(unsigned char )(dt>>8);

	addr--;
	if (( ch == 0x55 )|( ch == 0x56 ))
	{
		convbuf[addr]=0x56;
		chk=chk+0x56;
		convbuf[addr+1]=ch ^ 0x20;
		chk=chk+convbuf[addr+1];
		s55++;
	}
	else
	{	chk=chk+ch;
		if (( ch == 0x7d )|( ch == 0x7e ))
		{
			convbuf[addr]=0x7d;
			convbuf[addr+1]=ch ^ 0x20;

		}
		else
		{
			addr++;
			convbuf[addr]=ch;
		}
	}
	addr--;
	ch=2-s55;
	for( s55 = 0 ; s55 < ch ; s55++ )
	{
		convbuf[addr]=0;
		addr--;
	}
	convbuf[8]=chk & 0xff;
	chk=chk>>8;
	convbuf[7]=chk & 0xff;
	convbuf[addr]=6-addr;
	p=&convbuf[addr];
	return(p);
}
///////////////////////////////
//
//NAME: hangup
//DESCRIPTION: break internet
//CALL:
//INPUT:
//OUTPUT:
//
///////////////////////////////
void hangup(void)
{
	send_ctr_com0_buf[0]=0x7e;
	send_ctr_com0_buf[1]=0x31;
	send_ctr_com0_buf[2]=0x00;
	send_ctr_com0_buf[3]=0x04;
	send_ctr_com0_buf[4]=0x10;
	send_ctr_com0_buf[5]=0x7e;
	send_data0=0;
	send_ctr_com0_len=6;
	send_com0_finish=0;
	ack=0;
	send_com0_cnt=0;
	TI=1;
	settimer(9);
	while ( !ack )
	{
	;
	}
	killtimer(9);
	ack=0;
	phy_err=0;
	settimer(12);
	DSP_RCV=1;
	DSP_SEND=0;
	while( ! phy_err )
	{
		wait(100);
		wait(100);
		DSP_RCV=~DSP_RCV;
		DSP_SEND=~DSP_RCV;
	}
	DSP_RCV=1;
	DSP_SEND=1;
	phy_err=0;
	killtimer(12);
}
///////////////////////////////
//
//NAME: call
//DESCRIPTION: call isp num
//CALL:
//INPUT:
//OUTPUT:call ok =1; call error =0;
//
///////////////////////////////
bit call(void)
{
	unsigned char  recall,i;
	settimer(2);
	run=0;
	recall=0;
	ack=0;
	while(1)
	{
		send_ctr_com0_buf[0]=0x7e;
		send_ctr_com0_buf[1]=0x31;
		send_ctr_com0_buf[2]=0x00;
		send_ctr_com0_buf[3]=0x04;
		send_ctr_com0_buf[4]=0x01;
		send_ctr_com0_buf[5]=0x7e;
		send_data0=0;
		send_ctr_com0_len=6;
		send_com0_finish=0;
		ack=0;
		ppp_err=0;
		ppp_ok=0;
		send_com0_cnt=0;
		TI=1;
		settimer(9);
		while ( !ack )
		{
		;
		}
		killtimer(9);
		ack=0;
		while (!( ppp_ok | ppp_err ))
		{
			if ( ! timer7 ) settimer(7);
			wait(150);
		}
		killtimer(7);
		if ( ppp_ok )
		{
			killtimer(2);
			DSP_CALL=0;
			ppp_err=0;
			ppp_ok=0;
			return(1);
		}
		else
		{
			recall++;
			if ( recall > 1 )
			{
				killtimer(2);
				DSP_CALL=1;
				ppp_err=0;
				ppp_ok=0;
				return (0);
			}
			else
			{
				for ( i = 0 ; i < 120 ; i++ ) wait(100);
			}
		}
	}
}
///////////////////////////////
//
//NAME: send_data
//DESCRIPTION: send data to equ from modem
//CALL:
//INPUT:
//OUTPUT:NONE
//
///////////////////////////////
void send_data(void)
{
	unsigned int data len,itemp,chk;
	unsigned char data ch,addr;
	unsigned char *p;
	if ( com1_rcv_len != 0 )
    {
		DSP_SEND=0;
		settimer(5);
		ES1=0;
		ES0=0;
		com0_send_addr=com1_rcv_addr_hand;
	    com0_send_len=com1_rcv_len;
		chk=rcv_equ_chk;
	    if ( com0_send_len > 512 )
	    {
            com0_send_len=512;
            com1_rcv_len= com1_rcv_len-512;
            com1_rcv_addr_hand=com1_rcv_addr_hand+512;
			send_7d_cnt=0;
			if ( rcv_7d_cnt != 0 )
			{
				for ( len = 0 ; len < 512 ; len++ )
				{	itemp=len+com0_send_addr;
					if ( itemp > (SEND_BUF_MAX-1) ) itemp=itemp-SEND_BUF_MAX;
					if ( send_buf0[itemp] == 0x7d ) send_7d_cnt++;
					if ( send_7d_cnt == rcv_7d_cnt )break;
				}
				rcv_7d_cnt=	rcv_7d_cnt-send_7d_cnt;
				itemp=com0_send_addr+511;
				if ( send_buf0[itemp] == 0x7d )
				{
					com0_send_len--;
					com1_rcv_len++;
					com1_rcv_addr_hand--;
					rcv_7d_cnt++;
					send_7d_cnt--;
				}
			}
	    }
	    else
	    {
	        com1_rcv_addr_hand=com1_rcv_addr_hand+com1_rcv_len;
			send_7d_cnt=rcv_7d_cnt;
			com1_rcv_len=0;
			rcv_7d_cnt=0;
			rcv_equ_chk=0;
		}
		send_com0_cnt=0;
		if ( com1_rcv_addr_hand > (SEND_BUF_MAX-1) ) com1_rcv_addr_hand=com1_rcv_addr_hand-SEND_BUF_MAX;
		ES1=1;
		ES0=1;


		send_ctr_com0_buf[0]=0x7e;
		send_ctr_com0_buf[1]=0x35;
		len=com0_send_len-send_7d_cnt+21;//5112 len
		itemp=len & 0xff00;
		itemp=itemp>>8;
		send_ctr_com0_buf[2]=(unsigned char)itemp;
		itemp=len & 0xff;
		ch=( unsigned char )itemp;
		if (( ch == 0x7d ) | ( ch == 0x7e ))
		{
			send_ctr_com0_buf[3]=0x7d;
			send_ctr_com0_buf[4]=ch ^ 0x20;
			addr=5;
		}
		else
		{
			send_ctr_com0_buf[3]=ch;
			addr=4;
		}
		send_ctr_com0_buf[addr]=0x55;
		addr++;
		len=len-12;//send data len
		itemp=len & 0xff;
		ch=(unsigned char)itemp;
 	    if (( ch == 0x55 ) | ( ch == 0x56 ))
		{
			itemp=len & 0xff00;
			itemp=itemp>>8;
			ch=(unsigned char)itemp;
			send_ctr_com0_buf[addr]=ch;
			addr++;
			send_ctr_com0_buf[addr]=0x56;
			addr++;
			itemp=len & 0xff;
			ch=(unsigned char)itemp ^ 0x20;
			send_ctr_com0_buf[addr]=ch;
			addr++;
		}
		else
		{
			if (( ch == 0x7d ) | ( ch == 0x7e ))
			{
				send_ctr_com0_buf[addr]=0x00;
				addr++;
				itemp=len & 0xff00;
				itemp=itemp>>8;
				ch=(unsigned char)itemp;
				send_ctr_com0_buf[addr]=ch;
				addr++;
				send_ctr_com0_buf[addr]=0x7d;
				addr++;
				itemp=len & 0xff;
				ch=(unsigned char)itemp ;
				ch=ch ^ 0x20;
				send_ctr_com0_buf[addr]=ch;
				addr++;
			}
			else
			{
				send_ctr_com0_buf[addr]=0x00;
				addr++;
				itemp=len & 0xff00;
				itemp=itemp>>8;
				ch=(unsigned char)itemp;
				send_ctr_com0_buf[addr]=ch;
				addr++;
				itemp=len & 0xff;
				ch=(unsigned char)itemp ;
				send_ctr_com0_buf[addr]=ch;
				addr++;
			}
		}
		p=conver(eid);
		for ( ch = 0 ; ch < p[0] ; ch++ )
		{
			send_ctr_com0_buf[addr] = p[ch+1];//eid
			addr++;
		}
                ch=p[0]+1;
		itemp=p[ch];

		itemp=itemp<<8;
                ch++;
                itemp=itemp+p[ch];
		chk=chk+itemp;
		send_ctr_com0_buf[addr]=0x00;//type:send data
		addr++;
		p=conver(sendid);
		sendid++;
		for ( ch = 0 ; ch < p[0] ; ch++ )
		{
			send_ctr_com0_buf[addr] = p[ch+1];//send id
			addr++;
		}
                ch=p[0]+1;
		itemp=p[ch];
		itemp=itemp<<8;
                ch++;
		chk=chk+itemp+p[ch];

		send_ctr_com0_len=addr;
		send_com0_finish=0;
		send_data0=0;
		send_com0_cnt=0;
		TI=1;
		while ( !send_com0_finish )
		{
		;
		}
		send_com0_finish=0;
		send_data0=1;
		send_com0_cnt=0;
		TI=1;
		while ( !send_com0_finish )
		{
		;
		}
		send_com0_finish=0;
		addr=0;
		p=conver(chk);
		for ( ch = 0 ; ch < p[0] ; ch++ )
		{
			send_ctr_com0_buf[addr] = p[ch+1];//send id
			addr++;
		}
		send_ctr_com0_buf[addr]=0x55;
		addr++;
		send_ctr_com0_buf[addr]=0x7e;
		addr++;
		send_ctr_com0_len=addr;
		send_data0=0;
		ack=0;
		send_com0_cnt=0;
		send_com0_finish=0;
		TI=1;
		settimer(9);
		while ( !ack )
		{
		;
		}
		killtimer(9);
		ack=0;
	}
}
///////////////////////////////
//
//NAME: init_5112
//DESCRIPTION: set e5112
//CALL:
//INPUT:
//OUTPUT:NONE
//
///////////////////////////////
void init_5112(void)
{
	unsigned char  addr,i,len,temp;
	unsigned char *p;

	send_ctr_com0_buf[0]=0x7e;
	send_ctr_com0_buf[1]=0x2f;
	send_ctr_com0_buf[2]=0x00;
	send_ctr_com0_buf[3]=0x04;
	send_ctr_com0_buf[4]=0x08;//fffd:115200 fffa:57600 ffee:19200 for 11.0592MHz
	i=0xff;					  //ffb8 for 9600 ffdc for 19200 fff4 for 57600 for 22.1184MHz
	addr=0xf4;
	send_ctr_com0_buf[5]=0x7e;
	send_data0=0;
	send_ctr_com0_len=6;
	send_com0_finish=0;
	ack=0;
	send_com0_cnt=0;
	TI=1;						//set 5112 to cpu
	settimer(9);
	while ( !ack )
	{
	;
	}
	killtimer(9);
	ack=0;
	TR2=0;
	TH2=i;  // set cpu baud :cpu to 5112
	TL2=addr;
	RCAP2H=i;
	RCAP2L=addr;
	TR2=1;
	send_ctr_com0_buf[0]=0x7e;
	send_ctr_com0_buf[1]=0x32;
	send_ctr_com0_buf[2]=0x00;
	addr=5;
	temp=x_isp_num;
	p=x_read(temp,16);
	for ( i = 0 ; i < 16 ; i++ )
	{
		if ( p[i] != 0x00 ) send_ctr_com0_buf[i+addr]=p[i];
		else break;
	}
	send_ctr_com0_buf[4]=i;
	addr=addr+i;
	len=addr;
	addr++;
	temp=x_isp_name;
	p=x_read(temp,16);
	for ( i = 0 ; i < 16 ; i++ )
	{
		if ( p[i] == 0x00) break;
		else send_ctr_com0_buf[addr+i]=p[i];
	}
	send_ctr_com0_buf[len]=i;
	addr=addr+i;
	len=addr;
	addr++;
	temp=x_isp_password;
	p=x_read(temp,16);
	for ( i = 0 ; i < 16 ; i++ )
    {
		if ( p[i] == 0x00 ) break;
		else send_ctr_com0_buf[addr+i]=p[i];
	}
	send_ctr_com0_buf[len]=i;
	send_ctr_com0_buf[addr+i]=0x7e;
	send_ctr_com0_buf[3]=addr+i-1;
	ack=0;
	send_data0=0;
	send_ctr_com0_len=send_ctr_com0_buf[3]+2;
	send_com0_cnt=0;
	send_com0_finish=0;
	TI=1;								//set 5112 isp set
	settimer(9);
	while ( !ack )
	{
	;
	}
	killtimer(9);

	watchdog();
	send_ctr_com0_buf[0]=0x7e;
	send_ctr_com0_buf[1]=0x33;
	send_ctr_com0_buf[2]=0x00;
	send_ctr_com0_buf[3]=0x0b;
	temp=x_my_port;
	p=x_read(temp,2);
	send_ctr_com0_buf[4]=p[0];
	send_ctr_com0_buf[5]=p[1];
	temp=x_server_port;
	p=x_read(temp,2);
	send_ctr_com0_buf[6]=p[0];
	send_ctr_com0_buf[7]=p[1];
	temp=x_server_addr;
	p=x_read(temp,4);
	send_ctr_com0_buf[8]=p[0];
	send_ctr_com0_buf[9]=p[1];
	send_ctr_com0_buf[10]=p[2];
	send_ctr_com0_buf[11]=p[3];
	send_ctr_com0_buf[12]=0x7e;
	ack=0;
	send_data0=0;
	send_ctr_com0_len=13;
	send_com0_cnt=0;
	send_com0_finish=0;
	TI=1;						//set socket
	settimer(9);
	while ( !ack )
	{
	;
	}
	killtimer(9);

	send_ctr_com0_buf[0]=0x7e;
	send_ctr_com0_buf[1]=0x30;
	send_ctr_com0_buf[2]=0x00;
	send_ctr_com0_buf[3]=0x04;
	send_ctr_com0_buf[4]=0x09;
	send_ctr_com0_buf[5]=0x7e;
	ack=0;
	send_data0=0;
	send_ctr_com0_len=6;
	send_com0_cnt=0;
	send_com0_finish=0;
	TI=1;     					//set modem baud
	settimer(9);
	while ( !ack )
	{
	;
	}
	killtimer(9);
	ack=0;
}

///////////////////////////////
//
//NAME: settimer
//DESCRIPTION: set timer
//CALL:
//INPUT:ch
//OUTPUT:NONE
//
///////////////////////////////
void settimer( unsigned char ch)
{
	switch ( ch )
	{
		case 0:
			timer0=1;
			timer0_reg=0;
			break;
		case 1:
			timer1=1;
			timer1_reg=0;
			break;
		case 2:
			timer2=1;
			timer2_reg=0;
			break;
		case 3:
			timer3=1;
			timer3_reg=0;
			break;
		case 4:
			timer4=1;
			timer4_reg=0;
			break;
		case 5:
			timer5=1;
			timer5_reg=0;
			break;
		case 6:
			timer6=1;
			timer6_reg=0;
			break;
		case 7:
			timer7=1;
			timer7_reg=0;
			break;
		case 8:
			timer8=1;
			timer8_reg=0;
			break;
		case 9:
			timer9=1;
			timer9_reg=0;
			break;
		case 10:
			timer10=1;
			timer10_reg=0;
			break;
		case 11:
			timer11=1;
			timer11_reg=0;
			break;
		case 12:
			timer12=1;
			timer12_reg=0;
			break;
		case 13:
			timer13=1;
			timer13_reg=0;
			break;
		default:
			break;
	}
}
///////////////////////////////
//
//NAME: killtimer
//DESCRIPTION: set timer
//CALL:
//INPUT:ch
//OUTPUT:NONE
//
///////////////////////////////

⌨️ 快捷键说明

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