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

📄 gsm.c

📁 智能水表程序 来着互联网
💻 C
字号:
//-----------------------------------------------------------------------------
// gsm.c
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <reg52.h>
#include <string.h>
#include "cpu/cpu.h"
#include "main/main.h"
#include "ext/ds1307.h"
#include "comm/gsm.h"
#include "misc/misc.h"
#include "misc/general.h"
//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------
bit Check_Comm_Response ( char* p );
//-----------------------------------------------------------------------------
// External Interrupt 1 Routine
//-----------------------------------------------------------------------------
void Ext1_ISR (void) interrupt 2
{
	char i;
	pSTMsg msg;

	if ( bComm == DEAL_END && Uart1_Rxd == LOW )
	{
		for ( i = 0; i < HEAD_LEN; i++ )
			Comm_Buf [i] = Uart1_Receive_Byte ();
		msg = ( pSTMsg ) Comm_Buf;
		if ( MSG_TAG == msg->Tag1 && MSG_TAG == msg->Tag2 )
		{
			for ( ; i < ( HEAD_LEN + msg->Len2 + TAIL_LEN ); i++ )
				Comm_Buf [i] = Uart1_Receive_Byte ();		
			bComm = NEW_DATA;
		}
	}
//	IE1 = 0;                    // don't deal other interrupt request
//	EX1 = 1;					// open interrupt to maybe upadte just now
}
//-----------------------------------------------------------------------------
// Communication Protocol Response Routine
//-----------------------------------------------------------------------------
bit Check_Comm_Response ( char * p )
{
	char i;
	unsigned long ul;
	pSTMsg msg;

	msg = ( pSTMsg ) p;		
	p += HEAD_LEN;
	if ( Buffer_Sum ( p, msg->Len2 ) != *( p + msg->Len2 )) return DEAL_END;
	if ( memcmp ( p, f.City, sizeof( msg->Addr )) != 0 ) return DEAL_END;
	if ( msg->Ctrl != MSG_CMD ) return DEAL_END;

    switch ( msg->Type )
	{
		case READ_DATA:
			msg->Len1 = msg->Len2 + sizeof( STData );
			msg->u.Data.bStatus = STATUS;
			if ( bWire  == ERROR ) msg->u.Data.bStatus |= SENSOR_FAULT;
			if ( bRCtrl == STOP  ) msg->u.Data.bStatus |= PUMP_STOP;
			if ( bDoor  == OPEN  ) msg->u.Data.bStatus |= DOOR_OPEN;
			if ( bPump  == ON    ) msg->u.Data.bStatus |= I380_OFF;
			msg->u.Data.Resvd  = 0;
			msg->u.Data.Total  = Hex_BCD ( r.Total,  7 );
			msg->u.Data.Flow   = Hex_BCD ( f.Flow,   4 );
			msg->u.Data.Remain = Hex_BCD ( r.Remain, 7 );
			if ( bDue == TRUE )
				msg->u.Data.Remain |= isDUE;
			break;

		case SET_CLOCK:
			msg->Len1 = msg->Len2 - sizeof( STClock );
			Set_Clock ( &msg->u.Clock );
			break;

		case GET_CLOCK:
			msg->Len1 = msg->Len2 + sizeof( STClock );
			Get_Clock ( &msg->u.Clock );
			break;

		case SET_BASIS:
			if (( ul = BCD_Hex ( msg->u.mBasis, 7 )) >= TotalMax ) break;
			else r.Total = ul;
			f.Flow1 = (int) ul;
			Mem_Fee_Update ();
			break;

		case CTRL_PUMP:
			msg->Len1 += 1;
			if ( msg->u.Cmd_Rtn[0] == PUMPON )
			{
				bRCtrl = START;
				Relay_On ();
				Run_LED = ON;
			}
			else if ( msg->u.Cmd_Rtn[0] == PUMPOFF )
			{
				bRCtrl = STOP;
				Relay_Off ();
				Run_LED = OFF;
			}
			msg->u.Cmd_Rtn[1] = SUCCESS;
			break;

		default:
			return DEAL_END;
			break;
	}
	msg->Len2 = msg->Len1;
	msg->Ctrl = MSG_RTN;
	*( p + msg->Len2 ) = Buffer_Sum ( p, msg->Len2 );
	*( p + msg->Len2 + 1 ) = MSG_END;
	
	for ( p = (char *) msg, i = 0; i < ( HEAD_LEN + msg->Len2 + TAIL_LEN ); i++ )
		Uart1_Send_Byte ( *p++ );

	return DEAL_END;
}

⌨️ 快捷键说明

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