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

📄 5112udp.c

📁 一个嵌入式系统通过GPRS进行数据传输的程序,协议芯片为5112,程序中描述了通过单片机上网及通过UDP数据传输的过程
💻 C
📖 第 1 页 / 共 4 页
字号:
					{
						if ( chtemp == 0x7e )
						{
							rcv_data0=1;
							rcv_cnt0=0;

						}
					}
					else
					{
						if (( chtemp == 0x7e )&(receive_5112==0))
					    {
							dt=rcv_buf0[0];
							killtimer(8);
							switch ( dt )
							{
								case 0x41:
									ppp_err=1;
									DSP_CALL=1;
									DSP_LINK=1;
									phy_err=1;
									stat_ok=0;
									break;
								case 0x42:
									ppp_err=1;
									DSP_CALL=1;
									DSP_LINK=1;
									stat_ok=0;
									break;
								case 0x43:
									ppp_err=1;
									DSP_CALL=1;
									DSP_LINK=1;
									stat_ok=0;
									break;
								case 0x44:
									ppp_err=1;
									DSP_CALL=1;
									DSP_LINK=1;
									stat_ok=0;
									break;
								case 0x45:
									ppp_ok=1;
									break;
								case 0x48:
									if ( rcv_command )
									{
										rcv_command=0;
										idt=0;
										if ( rcv_buf0[11] == 0x03 )
										{
											idt=rcv_buf0[7]+rcv_buf0[8]+rcv_buf0[9]+rcv_buf0[10]+rcv_buf0[11];
											p=&rcv_buf0[12];
											chk=conver_chk(p);
										}
										if ( rcv_buf0[11] == 0x05 )
										{
											idt=0;
											for ( i = 7 ; i < 24 ; i++ ) idt=idt+rcv_buf0[i];
											p=&rcv_buf0[24];
											chk=conver_chk(p);
										}
										if ( chk == idt )//chk ok
										{
											dt=rcv_buf0[11];
											switch ( dt )
											{
												case 0x03:
													timer3_reg=0;
													timer13_reg=0;
													DSP_LINK=0;
													//settimer(3);
													reconnect_cnt=0;
													//settimer(11);
													break;
												case 0x05:
													dt=19;
													for( i = 0 ; i < 4 ; i++ )
													{
														dt--;
														if ( dt == 0x56 )
														{
															sockset[5-i]= rcv_buf0[dt+1] ^ 0x20;
															dt--;
														}
														else
														{
															sockset[5-i]=rcv_buf0[dt+1];
														}
													}
													p=&rcv_buf0[20];
													idt=conver_chk(p);
													chk=idt & 0xff00;
													chk=chk>>8;
													sockset[0]=( unsigned char )chk;
													chk=idt & 0xff;
													sockset[1]=( unsigned char )chk;
													rcv_set=1;
													break;
												default:
													break;
											}
										}
									}
									break;
								case 0x4c:
									ack=1;
									break;
								case 0x4d:
									smsindex=rcv_buf0[3];
									break;
								default:
									break;
							}
							if (( run == 1 )&( ppp_err == 1 ))
							{
								request_ppp=1;
								ppp_err=0;
							}
							rcv_data0=0;
							rcv_cnt0=0;
							com0tocom1=0;



						}
						else
						{
							if ( com0tocom1)
							{
								if ( rcv_data_len == 0 )
								{
									if ( dt == 0x55 )
									{
										p=&rcv_chk[0];
										idt=conver_chk(p);
										if ( idt == chk_add )//send data(from server) to equ
										{
												send_to_com1_addr=0;
												request_send_ack_to_server=1;
												if ( com1_send_finish == 1 )
												{
													TI1=1;
													com1_send_finish=0;

												}
												if ( !timer6 )
												{
													settimer(6);
													DSP_RCV=0;
												}

										}
										com0tocom1=0;

									}
									else
									{
										rcv_chk[rcv_chk_cnt]=dt;
										rcv_chk_cnt++;
									}
								}
								else
								{
									chk_add=chk_add+dt;
									rcv_data_len--;
									if ( rcv_data_len == 0 ) rcv_chk_cnt=0;
									if ( dt == 0x56 )
									{
										rcv_56=1;
									}
									else
									{
										if ( rcv_56 )
										{
											dt=dt ^ 0x20;
											rcv_56=0;
										}
										send_buf1[rcv_to_send_com1_addr]=dt;
										rcv_to_send_com1_addr++;

										if ( rcv_to_send_com1_addr > (RCV_BUF_MAX-1) ) rcv_to_send_com1_addr=RCV_BUF_MAX-1;
									}
								}
							}
							else
							{
								rcv_buf0[rcv_cnt0]=dt;

								if (( rcv_cnt0 == 11 ) & ( rcv_buf0[0] == 0x48 ))
								{
									settimer(8);
									if ( rcv_buf0[3] == 0x55 )
									{
										p=&rcv_buf0[7];
										idt=conver_chk(p);
										if ( idt == eid )
										{
											switch ( rcv_buf0[11] )
											{
											case 0x02:
										//	if ( rcv_buf0[11] == 0x02 )//receive data from server
										//	{
												if (com1_send_finish)
												{

													com0tocom1=1;
													chk_add=rcv_buf0[7]+rcv_buf0[8]+rcv_buf0[9]+rcv_buf0[10]+rcv_buf0[11];
													if ( rcv_buf0[5] == 0x56 )
													{
														rcv_data_len=rcv_buf0[4];
														rcv_data_len=rcv_data_len<<8;
														rcv_data_len=rcv_data_len+(rcv_buf0[6] ^ 0x20);
													}
													else
													{
														rcv_data_len=rcv_buf0[5];
														rcv_data_len=rcv_data_len<<8;
														rcv_data_len=rcv_data_len+rcv_buf0[6];
													}
													rcv_data_len=rcv_data_len-5;
													rcv_to_send_com1_addr=0;
												}

										//	}
												break;
											case 0x03:
												rcv_command =1;
												com0tocom1=0;
												break;
											case 0x05:
												rcv_command =1;
												com0tocom1=0;
												break;
											case 0x07:
												request_reset=1;
												break;
											case 0x08:
												issend_to_server=0;
												break;
											case 0x09:
												issend_to_server=1;
												break;
											default:
												break;
											}

										}
									}
								}

								rcv_cnt0++;
								if ( rcv_cnt0 == 30 ) rcv_cnt0=29;

							}
							if (( rcv_cnt0 == 1 ) & ( rcv_buf0[0] == 0x48 ))
							{
								receive_5112=1;
							}
							if ((chtemp == 0x55) & ( rcv_cnt0 > 4 ) & ( rcv_buf0[0] == 0x48 ))
							{
								receive_5112=0;
							}
						}

					}
				}
			}

		}

		RI=0;
	}
        ES0=1;
}
//////////////////////////////
//
//NAME: init_sys
//DESCRIPTION: INIT SYSTEM
//CALL:
//INPUT:  NONE
//OUTPUT:NONE
//
///////////////////////////////
void init_sys ( void )
{
	unsigned char  temp,i;
	unsigned char *p;
	i=x_mark;
	p=x_read(i,1);
	temp=*p;
	if (temp != 0x55)
    {
		//write default
		for ( i = 0 ; i < 4 ; i ++ ) xbuf[i]=0x00;
		p=&xbuf[0];
		temp=x_my_addr;
		x_write(temp,p,4);
		for ( i = 0 ; i < 4 ; i ++ ) xbuf[i]=0xff;
		p=&xbuf[0];
		temp=x_to_addr;
		x_write(temp,p,4);
		xbuf[0]=61;
		xbuf[1]=243;
		xbuf[2]=224;
		xbuf[3]=57;
		p=&xbuf[0];
		temp=x_server_addr;
		x_write(temp,p,4);
		xbuf[0]=0x25;//port=(1b5a)7002 (0599)1433 (2580)9600
		xbuf[1]=0x80;
		p=&xbuf[0];
		temp=x_server_port;
		x_write(temp,p,2);
		xbuf[0]='*';
		xbuf[1]='9';
		xbuf[2]='9';
		xbuf[3]='*';
		xbuf[4]='*';
		xbuf[5]='*';
		xbuf[6]='1';
		xbuf[7]='#';
		xbuf[8]=0x00;
		p=&xbuf[0];
		temp=x_isp_num;
		x_write(temp,p,9);
		xbuf[0]='8';
		xbuf[1]=0x00;
		p=&xbuf[0];
		temp=x_isp_name;
		x_write(temp,p,2);
		xbuf[0]='8';
		xbuf[1]=0x00;
		p=&xbuf[0];
		temp=x_isp_password;
		x_write(temp,p,2);
		xbuf[0]=0x1f;//my port=8000
		xbuf[1]=0x40;
		p=&xbuf[0];
		temp=x_my_port;
		x_write(temp,p,2);
		xbuf[0]=0xfa;//default baud
		p=&xbuf[0];
		temp=x_baud;
		x_write(temp,p,1);
		xbuf[0]=0x55;
		temp=x_mark;
		p=&xbuf[0];
		x_write(temp,p,1);
	}
	else
	{
		temp=x_baud;
		p=x_read(temp,1);
		TR1=0;
		TH1=p[0];
//	TH1=0x40;
		TL1=TH1;


		TR1=1;
	}
	temp=x_my_addr;
	p=x_read(temp,2);
	eid=p[0];
	eid=eid<<8;
	eid=eid+p[1];
    sendid=0;


	temp=x_server_port;
	p=x_read(temp,2);
	sockset[0]=p[0]; //server port
	sockset[1]=p[1];
	temp=x_server_addr;
	p=x_read(temp,4);
	sockset[2]=p[0]; //server ip
	sockset[3]=p[1];
	sockset[4]=p[2];
	sockset[5]=p[3];





}
//////////////////////////////
//
//NAME: init_cpu
//DESCRIPTION: init cpu
//CALL:
//INPUT:  NONE
//OUTPUT:NONE
//
///////////////////////////////
void init_cpu(void)
{
	X_CS=1;
	X_SO=1;
	X_SCK=0;

	X_SI=0;
	P4=0;
	STATUS=0x10;
	PMR=0x41;
//////////////////////////
// BELOW FOR SERIAL PORT
//COM0 ( 5112 ) COM1 ( EQU )
//COM0 : MODE3 9600  ; COM1: MODE1 9600
//TIMER 1 FOR COM1 ; TIMER 2 FOR COM0
	CKCON=0xC0; //watchdog:2.8S
//COM0:
	T2MOD=0x00;
	T2CON=0x30;//SET TIMER2 MODE FOR COM0
	TH2=0xff;  // ffdc for 9600 fffd for 115200 for 11.0592MHz
	TL2=0xb8;	//ffb8 for 9600 ffdc for 19200 fff4 for 57600 for 22.1184MHz
	RCAP2H=0xff;
	RCAP2L=0xb8;
	SCON0=0xd0;//SET COM0 MODE 3 RECEIVE ENABLE
//COM1:
	TMOD=0x20;//SET TIMER1 MODE 2
	SMOD=0;
	TH1=250;//64:300;160:600;208:1200;232:2400;244:4800         244:9600for 22.1184MHz
	TL1=250;//250:9600;253:19200;254:28800;255:57600
	SCON1=0x50;//SET COM1 MODE 1 RECEIVE ENABLE
	TR1=1;
	TR2=1;
	ES0=1;
	ES1=1;
//////////////////////////
// FOR TIMER0 FOR TIMER
	TMOD=TMOD | 0x01;
	TH0=0x4d;   //4d0c for 11.0592MHz  9a18 for 22.1184MHz
	TL0=0x0c;
	TR0=1;
	ET0=1;
//////////////////////////
	TA=0xaa;
	TA=0x55;
	EWT=0;
	EWDI=0;
        EIE=0;
        IP=0x50;
	EA=1;
}
/////////////////////////////////////////
//
//NAME: clear_ram
//DESCRIPTION: clear ram
//CALL:
//INPUT:
//RETURN:
////////////////////////////////////////
void clear_ram(void)
{
     request_ppp=0;
     run=0;
     ack=0;
     send_data0=0;
     ppp_ok=0;
     ppp_err =0;
	send_com0_finish=0;
	rcv_data0=0;
	com0tocom1=0;
	com1_send_finish=1;
	rcv_init=0;
	timer0=0;
	timer1=0;
	timer2=0;
	timer3=0;
	timer4=0;
	timer5=0;
	timer6=0;
	timer7=0;
	timer8=0;
	timer9=0;
	timer10=0;
	timer11=0;
	timer12=0;
	timer13=0;
	request_reset=0;
	waitinit=0;
	stat_ok=0;
	rcv_7d=0;
	send_disable=0;
	request_connect=0;////
	request_send_data_to_server=0;////
	request_send_chk_to_server=0;////
	request_send_ack_to_server=0;
	rcv_command=0;
	rcv_56=0;
	issend_to_server=0;
	receive_5112=0;
	rcv_set=0;
	phy_err=0;
	sm=0;
	com0_send_len=0;
	send_7d_cnt=0;
	send_ctr_com0_len=0;
	rcv_cnt0=0;
	rcv_to_send_com1_addr=0;
	send_to_com1_addr=0;
	com1_rcv_addr_hand=0;
	com1_rcv_len=0;
	com0_send_addr=0;
	rcv_7d_cnt=0;


	send_com0_cnt=0;
	timer0_reg=0;//for status flash
	timer1_reg=0;//200mS for receive init data
	timer2_reg=0;
	timer3_reg=0;
	timer4_reg=0;
	timer5_reg=0;
 	timer6_reg=0;
 	timer7_reg=0;
	timer8_reg=0;//5S for wait 5112 2nd 0x7e
	timer9_reg=0;
 	timer10_reg=0;//10S for link test from equ to server
	timer11_reg=0;//250mS for link test flash
	timer12_reg=0;
	timer13_reg=0;

	eid=0;
	chk_add=0;
	rcv_data_len=0;
	rcv_chk_cnt=0;
	rcv_equ_chk=0;
	sendid=0;
	reconnect_cnt=0;

	smsindex=0;
}
//below functions are for x5045
/////////////////////////////////////////
//
//NAME: x_write
//DESCRIPTION: WRITE MUL-BYTES TO X5045
//CALL: x_outbyte,wait,x_wren_cmd
//INPUT: x_address: address of x5045 000h-01ffh
//       *psavedata :data pointer to be saved
//		 amount: counter of data <0x10
//RETURN:NONE
////////////////////////////////////////
void x_write ( unsigned char x_address,unsigned char *psavedata,unsigned char amount)
{
	unsigned char   sendaddress,i,ch;
	P4=0x08;
	x_wren_cmd();
	_nop_();
        _nop_();
	X_SCK=0;
	wait(5);
	X_CS=0;
	_nop_();
        _nop_();
/*	if ( x_address >=0x100 )
	{	x_outbyte(0x0a);
		x_address = x_address-0x100 ;
	}
	else
	{
*/		x_outbyte(0x02);
//	}
	sendaddress=(unsigned char ) x_address;
	x_outbyte(sendaddress);
	for (i=0 ; i<amount ;i++)
	{       ch=*psavedata;
		x_outbyte( ch );
                psavedata++;
                }
	X_SCK=0;
        _nop_();
	_nop_();
	X_CS=1;
	wait(6);
	P4=0x00;
}
/////////////////////////////////////////
//
//NAME: x_read
//DESCRIPTION: WRITE MUL-BYTES TO X5045
//CALL: x_outbyte,x_inbyte;wait,x_wren_cmd
//INPUT: address: address of x5045
//		 amount: counter of data
//RETURN:data pointer
//
////////////////////////////////////////
unsigned char  * x_read( unsigned char address ,unsigned char  amount)
{
	unsigned char  * preaddata;
	unsigned char  sendaddress,i;

	X_SCK=0;
	wait(6);
	X_CS=0;
/*	if ( address >=0x100 )
	{	x_outbyte(0x0b);
		address=address-0x100;
	}
	else
	{
*/		x_outbyte(0x03);
//	}
	sendaddress=(unsigned char ) address;
	x_outbyte(sendaddress);
	for ( i=0 ; i<amount ;i++)
	{	xbuf[i]=x_inbyte();
         }

	X_SCK=0;
        _nop_();
	_nop_();
	X_CS=1;
	preaddata=&xbuf;

	return(preaddata);
}
/////////////////////////////////////////
//
//NAME: x_wren_cmd
//DESCRIPTION: WRITE ENABLE
//CALL: x_outbyte
//INPUT:NONE
//RETURN:NONE
////////////////////////////////////////
void x_wren_cmd (void)
{
	X_SCK=0;
	wait(3);
	X_CS=0;
	x_outbyte(0x06);
	X_SCK=0;
	_nop_();
        _nop_();
	X_CS=1;
}
/////////////////////////////////////////
//
//NAME: init_watchdog
//DESCRIPTION: INIT WATCHDOG TO X5045
//CALL: x_outbyte,x_wren_cmd
//INPUT: 03:disable watchdog 02:200mS 01:600mS 00:1.4S
//RETURN:NONE
////////////////////////////////////////
void init_watchdog(unsigned char ch)
{
	P4=0x08;
	if (!( ch > 0x03))
	{
		x_wren_cmd();
                _nop_();
		X_SCK=0;
		_nop_();
                _nop_();
		X_CS=0;
		x_outbyte(0x01);
		ch=ch<<4;
		x_outbyte(ch);
		X_SCK=0;
		_nop_();
                _nop_();
		X_CS=1;
	}
	P4=0x00;
}
unsigned char x_inbyte( void )
{
	unsigned char   i;
	unsigned char   ch;
	ch=0x00;
	for ( i=0 ; i<8 ;i++ )
	{	X_SCK=1;
		_nop_();
                _nop_();
		X_SCK=0;
		ch=ch*2;
		if (X_SO)
        {  ch=ch+1;
        }
 	}
	return ( ch );
}
void x_outbyte( unsigned char ch) 	//ch:data to be sent to x5045
{
	unsigned char   i;
	for ( i=0 ; i<8 ; i++ )
	{	X_SCK=0;
		_nop_();
                _nop_();
		X_SI=(bit)(ch & 0x80);
                _nop_();
		ch=ch*2;
		X_SCK=1;
		_nop_();
                _nop_();
	 }
	 _nop_();
         _nop_();
	 X_SI=0;
}
//X5045 PROG END ///////////////////////
/////////////////////////////////////////
//
//NAME: wait
//DESCRIPTION: WAIT
//CALL: NONE
//INPUT: time:mS <170
//RETURN:NONE
////////////////////////////////////////
void wait(unsigned int time)
{
        time=time*367;
	for ( time; time>=1 ; time--)
	{
    }
	watchdog();
}
/////////////////////////////////////////
//
//NAME: watchdog
//DESCRIPTION: watchdog prog
//CALL: NONE
//INPUT: none
//RETURN:NONE
////////////////////////////////////////
void watchdog(void)
{
	TA=0xaa;
	TA=0x55;
	RWT=1;
	X_CS=0;
	_nop_();
	_nop_();
        _nop_();
	X_CS=1;
}

⌨️ 快捷键说明

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