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

📄 5112udp.c

📁 一个嵌入式系统通过GPRS进行数据传输的程序,协议芯片为5112,程序中描述了通过单片机上网及通过UDP数据传输的过程
💻 C
📖 第 1 页 / 共 4 页
字号:
#include <reg530.h>
#include <d-com.h>
#include <intrins.h>
void main( void )
{
	unsigned char data i,k;
	unsigned int data j;
	unsigned char *p;
	bit b;


	TA=0xaa;
	TA=0x55;
	EWT=0;
	init_cpu();




	watchdog();
 //	init_watchdog(0x03);
	clear_ram();
	DSP_STAT=0;
	DSP_LINK=0;
	DSP_CALL=0;
	DSP_SEND=0;
	DSP_RCV=0;
	RST_5112=1;
	waitinit=1;
	RST_5112=0;
	settimer(13);

	for ( i = 0 ; i < 24 ; i++ ) wait(150);
	DSP_RCV=1;
	for ( i = 0 ; i < 24 ; i++ ) wait(150);
	DSP_SEND=1;
	for ( i = 0 ; i < 24 ; i++ ) wait(150);
	DSP_STAT=1;
	for ( i = 0 ; i < 24 ; i++ ) wait(150);
	DSP_LINK=1;
	for ( i = 0 ; i < 24 ; i++ ) wait(150);




	TA=0xaa;
	TA=0x55;
	EWT=1;
	init_watchdog(0x00);
	waitinit=0;
	init_sys();
	init_5112();
	settimer(0);
	issend_to_server=1;
	settimer(10);
	while(1)
	{
		j++;
		if ( j > 2000)
		{
			watchdog();
			j=0;
		}
		if ( request_ppp == 1 | run == 0 )
		{
			killtimer(3);
			DSP_LINK=1;
			DSP_CALL=1;
			if ( run == 1 )
			{
				smsindex=0;
				hangup();
				DSP_RCV=1;
				DSP_SEND=0;
				for ( k = 0 ; k < 12 ; k++ )
				{
					wait(100);
					wait(100);
					wait(100);
					wait(100);
					DSP_RCV=~DSP_RCV;
					DSP_SEND=~DSP_RCV;
				}
				DSP_RCV=1;
				DSP_SEND=1;
				if ( smsindex != 0 ) sm_prog();
			}
			b=0;
			i=0;
			while( !b )
			{
				b=call();
				if ( b ) break;
				i++;
				if ( i >= 5 )
				{
					while(1)
					{
					}
				}
				if ( i > 1 )
				{
					//hangup();
					gsm_poweroff();
					
					RST_5112=1;
					wait(100);
					wait(100);
					wait(100);
					RST_5112=0;
					for ( k = 0 ; k < 150 ; k++ ) wait(100);
					reset_5112();
				}
				else
				{
					for ( k = 0 ; k < 60 ; k++ ) wait(100);
				}

			}
			request_ppp=0;
			run=1;
		}
		if ( ! timer3 ) settimer(3);
		if ( request_reset )
		{
			hangup();
			gsm_poweroff();
			while(1)
			{
			;
			}
		}

		if ( rcv_set == 1 )//save socket set
		{
			p=&sockset[0];
			i=x_server_port;
			x_write(i,p,2);//write server port
			p=&sockset[2];
			i=x_server_addr;
			x_write(i,p,4);//write server port

			if (( rcv_data0 == 0 ) & (send_com0_finish == 1 ))
			{
				sendsetack();
				DSP_SEND=0;
				settimer(11);
				rcv_set=0;
				killtimer(0);//display for set socket ok
				b=DSP_CALL;
				DSP_STAT=1;
				DSP_LINK=1;
				DSP_CALL=1;
				DSP_SEND=1;
				DSP_RCV=1;
				wait(150);
				wait(150);
				DSP_STAT=0;
				DSP_LINK=0;
				DSP_CALL=0;
				DSP_SEND=0;
				DSP_RCV=0;
				wait(150);
				wait(150);
				DSP_STAT=1;
				DSP_LINK=1;
				DSP_CALL=1;
				DSP_SEND=1;
				DSP_RCV=1;
				DSP_CALL=b;
				settimer(0);
			}
		}
		if ( request_send_ack_to_server == 1 )
		{
			if (( rcv_data0 == 0 ) & (send_com0_finish == 1 ))
			{
				resetconnect();
				sendack();
				DSP_SEND=0;
				settimer(11);
				request_send_ack_to_server=0;
			}
		}
		else
		{
			if ( request_send_data_to_server == 1)
			{
				timer10_reg=0;
				if (( rcv_data0 == 0 ) & (send_com0_finish == 1 ))
				{
					resetconnect();
					send_data();
					request_send_data_to_server=0;
				}
			}
			else
			{
				if ( request_send_chk_to_server == 1 )
				{
					if (( rcv_data0 == 0 ) & (send_com0_finish == 1 ))
					{
						resetconnect();
						sendchk();
						DSP_SEND=0;
						settimer(11);
						request_send_chk_to_server=0;
					}
				}
			}
		}
	}
}
///////////////////////////////
//
//NAME: reset_5112
//DESCRIPTION: reset wavecom and 5112 for call fail
//CALL:
//INPUT:
//OUTPUT:
//
///////////////////////////////
void reset_5112(void)
{
	TR2=0;
	TH2=0xff;  // ffb8 for 9600 ffdc for 19200 fff4 for 57600 for 22.1184MHz
	TL2=0xb8;
	RCAP2H=0xff;
	RCAP2L=0xb8;
	TR2=1;
	init_5112();
}
///////////////////////////////
//
//NAME: gsm_poweroff
//DESCRIPTION: power off gsn
//CALL:
//INPUT:
//OUTPUT:
//
///////////////////////////////
void gsm_poweroff(void)
{
	unsigned char i;
	DSP_SEND=0;
	DSP_RCV=0;

	send_ctr_com0_buf[0]=0x7e;
	send_ctr_com0_buf[1]=0x39;
	send_ctr_com0_buf[2]=0x00;
	send_ctr_com0_buf[3]=0x03;
	send_ctr_com0_buf[4]=0x7e;
	send_data0=0;
	send_ctr_com0_len=5;
	send_com0_cnt=0;
	send_com0_finish=0;
	TI=1;
	ack=0;
	settimer(9);
	while ( !ack )
	{
	;
	}
	killtimer(9);
        sm=1;
	send_ctr_com0_buf[0]='A';//send power off command to wavecom
	send_ctr_com0_buf[1]='T';
	send_ctr_com0_buf[2]='+';
	send_ctr_com0_buf[3]='C';
	send_ctr_com0_buf[4]='P';
	send_ctr_com0_buf[5]='O';
	send_ctr_com0_buf[6]='F';
	send_ctr_com0_buf[7]=0x0d;
	send_data0=0;
	send_ctr_com0_len=8;
	send_com0_cnt=0;
	send_com0_finish=0;
	rcv_cnt0=0;
	send_buf0[2]=0;
	send_buf0[3]=0;
	TI=1;
	while ( ! send_com0_finish )
	{
	;
	}
	send_com0_finish=0;
	i=0;
	while (1)
	{
		if ( ( send_buf0[2] == 'O' ) & ( send_buf0[3] == 'K' ) ) break;
		else
		{
			wait(100);
			i++;
			if ( i > 150 ) break;
		}
	}
	for ( i = 0 ; i < 10 ; i++ ) wait(100);
	sm=0;
	rcv_cnt0=0;
	rcv_7d=0;
	rcv_data0=0;
	rcv_command=0;
	com0tocom1=0;
	rcv_data_len=0;
	chk_add=0;
	send_to_com1_addr=0;
	request_send_ack_to_server=0;
	rcv_chk_cnt=0;
	rcv_to_send_com1_addr=0;
	receive_5112=0;
	DSP_SEND=1;
	DSP_RCV=1;
}
///////////////////////////////
//
//NAME: sm_prog
//DESCRIPTION: short message program for set socket
//CALL:
//INPUT:
//OUTPUT:
//
///////////////////////////////
void sm_prog(void)
{
	unsigned int addr, itemp;
	unsigned char i,chtemp,ch;
	unsigned char *p;
	bit set,reset;
	reset=0;
	set=0;
	sm=1;
	send_ctr_com0_buf[0]=0x7e;
	send_ctr_com0_buf[1]=0x39;
	send_ctr_com0_buf[2]=0x00;
	send_ctr_com0_buf[3]=0x03;
	send_ctr_com0_buf[4]=0x7e;
	send_data0=0;
	send_ctr_com0_len=5;
	send_com0_cnt=0;
	send_com0_finish=0;
	TI=1;
	ack=0;
	settimer(9);
	while ( !ack )
	{
	;
	}
	killtimer(9);
	DSP_SEND=0;
	DSP_RCV=0;
	while( smsindex )
	{
		send_ctr_com0_buf[0]='A';//read short message
		send_ctr_com0_buf[1]='T';
		send_ctr_com0_buf[2]='+';
		send_ctr_com0_buf[3]='C';
		send_ctr_com0_buf[4]='M';
		send_ctr_com0_buf[5]='G';
		send_ctr_com0_buf[6]='R';
		send_ctr_com0_buf[7]='=';
		if ( smsindex > 9 )
		{
			ch=smsindex/10;
			ch=ch+0x30;
			send_ctr_com0_buf[8]=ch;
			ch=smsindex-(smsindex/10)*10+0x30;
			send_ctr_com0_buf[9]=ch;
			chtemp=10;
		}
		else
		{
			send_ctr_com0_buf[8]=smsindex+0x30;
			chtemp=9;
		}
		send_ctr_com0_buf[chtemp]=0x0d;
		chtemp++;
		send_data0=0;
		send_ctr_com0_len=chtemp;
		send_com0_cnt=0;
		send_com0_finish=0;
		rcv_cnt0=0;
		TI=1;
		while ( ! send_com0_finish )
		{
		;
		}
		wait(150);
		wait(150);
		wait(150);

		for ( addr = 0 ; addr < (rcv_cnt0-6) ; addr++ )
		{
			if (( send_buf0[addr] == 'F') & ( send_buf0[addr+1] == 'F') & ( send_buf0[addr+2] == 'A') & ( send_buf0[addr+3] == 'A') & ( send_buf0[addr+4] == '5') & ( send_buf0[addr+5] == '5') )
			{
				itemp=addr+18;
				if (( send_buf0[itemp] == '5') & ( send_buf0[itemp+1] == '5') & ( send_buf0[itemp+2] == 'A') & ( send_buf0[itemp+3] == 'A') & ( send_buf0[itemp+4] == 'F') & ( send_buf0[itemp+5] == 'F') )
				{

					addr=addr+6;
					if (( send_buf0[addr] == 'R') & ( send_buf0[addr+1] == 'E') & ( send_buf0[addr+2] == 'S') & ( send_buf0[addr+3] == 'E') & ( send_buf0[addr+4] == 'T'))
					{
						reset=1;
					}
					else
					{
						for ( i = 0 ; i < 6 ; i++ )
						{
							chtemp=send_buf0[addr];
							chtemp=chtemp & 0x0f;
							ch=chtemp<<4;
							addr++;
							chtemp=send_buf0[addr];
							chtemp=chtemp & 0x0f;
							ch=chtemp | ch;
							sockset[i]=ch;
							addr++;
						}
						p=&sockset[0];
						i=x_server_port;
						x_write(i,p,2);//write server port
						p=&sockset[2];
						i=x_server_addr;
						x_write(i,p,4);//write server port
						set=1;
					}
					for ( i = smsindex ; i > 0 ; i -- ) //delete other all short messages
					{
						send_ctr_com0_buf[0]='A';//delete short message
						send_ctr_com0_buf[1]='T';
						send_ctr_com0_buf[2]='+';
						send_ctr_com0_buf[3]='C';
						send_ctr_com0_buf[4]='M';
						send_ctr_com0_buf[5]='G';
						send_ctr_com0_buf[6]='D';
						send_ctr_com0_buf[7]='=';
						if ( i > 9 )
						{
							ch=i/10;
							ch=ch+0x30;
							send_ctr_com0_buf[8]=ch;
							ch=i-(i/10)*10+0x30;
							send_ctr_com0_buf[9]=ch;
							chtemp=10;
						}
						else
						{
							send_ctr_com0_buf[8]=i+0x30;
							chtemp=9;
						}
						send_ctr_com0_buf[chtemp]=0x0d;
						chtemp++;


						send_data0=0;
						send_ctr_com0_len=chtemp;
						send_com0_cnt=0;
						send_com0_finish=0;
						rcv_cnt0=0;
						TI=1;
						while ( ! send_com0_finish )
						{
						;
						}
						wait(150);
						wait(150);
						DSP_SEND=1;
						DSP_RCV=1;
						wait(150);
						wait(150);
						DSP_SEND=0;
						DSP_RCV=0;
						wait(150);
						wait(150);
						wait(150);
					}
					while ( reset )
					{
					;
					}
					break;
				}
			}
		}
		if ( ! set )
		{
			send_ctr_com0_buf[0]='A';//delete short message
			send_ctr_com0_buf[1]='T';
			send_ctr_com0_buf[2]='+';
			send_ctr_com0_buf[3]='C';
			send_ctr_com0_buf[4]='M';
			send_ctr_com0_buf[5]='G';
			send_ctr_com0_buf[6]='D';
			send_ctr_com0_buf[7]='=';
			if ( smsindex > 9 )
			{
				ch=smsindex/10;
				ch=ch+0x30;
				send_ctr_com0_buf[8]=ch;
				ch=smsindex-(smsindex/10)*10+0x30;
				send_ctr_com0_buf[9]=ch;
				chtemp=10;
			}
			else
			{
				send_ctr_com0_buf[8]=smsindex+0x30;
				chtemp=9;
			}
			send_ctr_com0_buf[chtemp]=0x0d;
			chtemp++;
			send_data0=0;
			send_ctr_com0_len=chtemp;
			send_com0_cnt=0;
			send_com0_finish=0;
			rcv_cnt0=0;
			TI=1;
			while ( ! send_com0_finish )
			{
			;
			}
			wait(150);
			wait(150);
			DSP_SEND=1;
			DSP_RCV=1;
			wait(150);
			wait(150);
			DSP_SEND=0;
			DSP_RCV=0;
			wait(150);
			wait(150);
			wait(150);
			smsindex--;
		}
		else
		{
			killtimer(0);//display for set socket ok
			DSP_STAT=1;
			DSP_LINK=1;
			DSP_CALL=1;
			DSP_SEND=1;
			DSP_RCV=1;
			wait(150);
			wait(150);
			DSP_STAT=0;
			DSP_LINK=0;
			DSP_CALL=0;
			DSP_SEND=0;
			DSP_RCV=0;
			wait(150);
			wait(150);
			DSP_STAT=1;
			DSP_LINK=1;
			DSP_CALL=1;
			DSP_SEND=1;
			DSP_RCV=1;
			settimer(0);
			break;
		}
	}
	send_ctr_com0_buf[0]='&';
	send_ctr_com0_buf[1]='&';
	send_ctr_com0_buf[2]='&';
	send_data0=0;
	send_ctr_com0_len=3;
	send_com0_cnt=0;
	send_com0_finish=0;
	TI=1;
	while ( ! send_com0_finish )
	{
	;
	}
	for ( i = 0 ; i < 15 ; i ++ ) wait(100);
	sm=0;
	rcv_cnt0=0;
	rcv_7d=0;
	rcv_data0=0;
	rcv_command=0;
	com0tocom1=0;
	rcv_data_len=0;
	chk_add=0;
	send_to_com1_addr=0;
	request_send_ack_to_server=0;
	rcv_chk_cnt=0;
	rcv_to_send_com1_addr=0;
	receive_5112=0;
	DSP_SEND=1;
	DSP_RCV=1;
}
///////////////////////////////
//
//NAME: conver receive chk to int
//DESCRIPTION: conver receive chk to int
//CALL:
//INPUT:
//OUTPUT:
//
///////////////////////////////
unsigned int conver_chk(unsigned char *p)
{
	unsigned int data dt,itemp;
	unsigned char data addr;
	if ( p[2] == 0x56 )
	{
		dt=p[3] ^ 0x20;
		addr=1;
	}
	else
	{
		dt=p[3];
		addr=2;
	}
	addr--;
	if ( p[addr]==0x56)
	{
		itemp=p[addr+1] ^ 0x20;
		itemp=itemp<<8;
		dt=dt+itemp;
 	}
	else
	{
		itemp=p[addr+1];
		itemp=itemp<<8;
		dt=dt+itemp;

	}
	return(dt);
}
///////////////////////////////
//
//NAME: sendsetack
//DESCRIPTION: send set ack  data to server
//CALL:
//INPUT:
//OUTPUT:
//
///////////////////////////////
void sendsetack(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]=0x06;
	chk=chk+6;
	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: sendack
//DESCRIPTION: send ack  data to server
//CALL:
//INPUT:
//OUTPUT:
//
///////////////////////////////
void sendack(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]=0x04;
	chk=chk+4;
	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: sendchk

⌨️ 快捷键说明

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