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

📄 gsm.c

📁 C语言编写的监控中心终端程序。基于GPRS上传收发数据功能
💻 C
📖 第 1 页 / 共 5 页
字号:
#include "stdlib.h"
#include "config.h"
#include "regmap.h"
#include "memmap.h"
#include "global.h"
#include "sio.h"
#include "gpio.h"
#include "func.h"
#include "util.h"
#include "graph.h"
#include "osdfont.h"
#include "gsmdef.h"

#ifdef SUPPORT_GPRS_FUNCTION

/************************************************************************
 *	GSM Port Define							*
 ************************************************************************/
#define	GSM_POWER		(1 << 6)
#define	GSM_POWER_HI		(Bus1SetBit(GSM_POWER, 1))
#define	GSM_POWER_LO		(Bus1SetBit(GSM_POWER, 0))

#define	GSM_DTR			49
#define	GSM_DSR			24
#define	GSM_RI			39
/*
#define	GSM_RTS			39
#define	GSM_CTS			38
*/

#define	GSM_DTR_HI		(GPIO_O_SET(GSM_DTR, 1))
#define	GSM_DTR_LO		(GPIO_O_SET(GSM_DTR, 0))
#define	GSM_DSR_IN		(GPIO_I_GET(GSM_DSR))
#define	GSM_RI_IN		(GPIO_I_GET(GSM_RI))

/*
#define	GSM_CTS_HI		(GPIO_O_SET(GSM_CTS, 1))
#define	GSM_CTS_LO		(GPIO_O_SET(GSM_CTS, 0))
#define	GSM_RTS_IN		(GPIO_I_GET(GSM_RTS))
#define	GSM_CTS_IN		(GPIO_I_GET(GSM_CTS))
*/

/************************************************************************
 *	GSM Buffer Define						*
 ************************************************************************/
static	UINT16		GSMReadSize;				// 接收缓冲区的当前位置
static	UINT16		GSMReadAddr;
static	UINT16		GSMReadStop;
static	UINT16		GSMSaveSize;
#define	GSMReadCurr	GSMReadBuff + GSMReadSize

static	BYTE		GSMSendSize;				// 发送缓冲区的当前位置
#define	GSMSendCurr	GSMSendBuff + GSMSendSize

/********************************************************
	SMS Send/Read FIFO Define
 ********************************************************/
#define	FIFO_SEND_SIZE		32
#define	FIFO_SEND_MASK		(FIFO_SEND_SIZE - 1)
#define	FIFO_SEND_FI(d)		SMSSendFIFO[SMSSendFI++] = (d);	\
				SMSSendFI &= FIFO_SEND_MASK
#define	FIFO_SEND_FO(d)		(d) = SMSSendFIFO[SMSSendFO++];	\
				SMSSendFO &= FIFO_SEND_MASK
#define	FIFO_SEND_FC(d)		(d) = SMSSendFIFO[SMSSendFO]
#define	FIFO_SEND_FF		SMSSendFO++;			\
				SMSSendFO &= FIFO_SEND_MASK
#define	FIFO_SEND_EMPTY		(SMSSendFI == SMSSendFO)
#define	FIFO_SEND_FULL		(((SMSSendFI + 1) & FIFO_SEND_MASK) == SMSSendFO)

#define	FIFO_READ_SIZE		16
#define	FIFO_READ_MASK		(FIFO_READ_SIZE - 1)
#define	FIFO_READ_FI(d)		SMSReadFIFO[SMSReadFI++] = (d);	\
				SMSReadFI &= FIFO_READ_MASK
#define	FIFO_READ_FO(d)		(d) = SMSReadFIFO[SMSReadFO++];	\
				SMSReadFO &= FIFO_READ_MASK
#define	FIFO_READ_FC(d)		(d) = SMSReadFIFO[SMSReadFO]
#define	FIFO_READ_FF		SMSReadFO++;			\
				SMSReadFO &= FIFO_READ_MASK
#define	FIFO_READ_EMPTY		(SMSReadFI == SMSReadFO)
#define	FIFO_READ_FULL		(((SMSReadFI + 1) & FIFO_READ_MASK) == SMSReadFO)

static	UINT16		SMSSendFIFO[FIFO_SEND_SIZE];
static	BYTE		SMSSendFI;
static	BYTE		SMSSendFO;

static	BYTE		SMSReadFIFO[FIFO_READ_SIZE];
static	BYTE		SMSReadFI;
static	BYTE		SMSReadFO;

/********************************************************
	GSM Public Define
 ********************************************************/
#define	GSM_BLOCK_INTERVAL	(TIMER_xS(60) / 2)
#define	SMS_EMPTY_INTERVAL	(TIMER_xS(60) * 5)

/********************************************************
	GSM Public variabler
 ********************************************************/
static	BYTE		GSMRoundState;
static	BYTE		GSMRetryCount;
static	UINT16		GSMDelayCount;
static	UINT16		GSMDelayTimer;
static	BYTE		GSMSenseTimer;

static	BYTE		GSMCheckState;
static	BYTE		GSMCheckCount;
static	BYTE		GSMCheckError;
static	BYTE		GSMCheckTimer;

static	BYTE		GSMFuncReturn;

/********************************************************
	GSM Send Command state variabler
 ********************************************************/
static	BYTE		GSMModemReply;
static	BYTE		GSMSendDataStep;
static	BYTE		GSMSendCommStep;
static	BYTE		GSMSendCommType;
static	BYTE		GSMSendCommPara;
static	BYTE		GSMReadCommPara;

/********************************************************
	GSM Hardware state variabler
 ********************************************************/
static	BYTE		GSMPowerState;
static	BYTE		GSMSleepState;
static	BYTE		GSMResetState;
static	BYTE		GSMSetupState;

/********************************************************
	GSM Phone State variabler
 ********************************************************/
static	BYTE		GSMPhoneState;
static	BYTE		GSMPhonePhase;
static	BYTE		GSMPhoneTooth;
static	BYTE		GSMPhoneTimer;
static	BYTE		GSMPhoneValue;
static	BYTE		GSMPhoneReady;

/********************************************************
	GSM - GPRS State variabler
 ********************************************************/
static	BYTE		GSMHelloState;
static	BYTE		GSMEnterState;
static	BYTE		GSMLeaveState;
static	BYTE		GSMRenetState;
static	BYTE		GSMCloseState;
static	BYTE		GSMClearState;
static	BYTE		GSMErrorState;

static	BYTE		GSMEnterCount;		// GPRS Enter Steps
static	BYTE		GSMBreakCount;		// GPRS broked by other

static	BYTE		GSMBlockState;		// GPRS can't enter
static	UINT16		GSMBlockTimer;

static	BYTE		GSMRadioState;		// GPRS Phone call

static	BYTE		GSMCenterFlag;
static	UINT16		GSMCenterPos1;
static	UINT16		GSMCenterPos2;

static	BYTE		GSMPinRIState;
static	BYTE		GSMPinRICount;

/********************************************************
	SMS - Public state variabler
 ********************************************************/
static	BYTE		SMSReadState;
static	BYTE		SMSSendState;
static	BYTE		SMSHeadState;
static	BYTE		SMSTailState;

static	BYTE		SMSReadIndex;
static	BYTE		SMSSendRetry;

static	BYTE		SMSEmptyIndex;
static	BYTE		SMSEmptyCount;
static	UINT16		SMSEmptyTimer;
static	BYTE		SMSBlockState;
static	BYTE		SMSGuardState;

static	BYTE		SMSGuardData;
static	BYTE		SMSGuardWarn;

static	UINT16		SMSSendInfo;
static	BYTE		SMSSendInfoHost;
static	BYTE		SMSSendInfoType;

/********************************************************
	CGD - Public state variabler
 ********************************************************/
#define	CGD_COUNT_MAX		5

static	BYTE		CGDCountState[CGD_COUNT_MAX];
static	BYTE		CGDCountIndex;
static	BYTE		CGDCountRetry;

/********************************************************
	Public Misc variabler
 ********************************************************/
static	BYTE	       *PtrTempAddr;
static	BYTE	       *StrCurr;
static	BYTE	       *StrNext;
static	BYTE		StrLineBuff[20];

/************************************************************************
 *	Init Code Start							*
 ************************************************************************/
static void InitReadBuff(void)
{
    GSMReadSize		= 0;
    GSMReadBuff[0]	= 0;
}

static void InitSendBuff(void)
{
    GSMSendSize		= 0;
    GSMSendBuff[0]	= 0;
}

static void InitDataBuff(void)
{
}

static void InitUserBuff(void)
{
    BYTE		i;

    InitReadBuff();
    InitSendBuff();
    InitDataBuff();

    GSMPowerState	= STATE_IDLE;
    GSMSleepState	= STATE_IDLE;
    GSMResetState	= STATE_IDLE;
    GSMSetupState	= STATE_IDLE;

    GSMCheckState	= STATE_IDLE;
    GSMCheckCount	= 0;
    GSMCheckError	= 0;

    GSMPhoneState	= STATE_IDLE;
    GSMPhonePhase	= GSM_PHONE_HANG;
    GSMPhoneTooth	= FALSE;

    GSMHelloState	= STATE_IDLE;
    GSMEnterState	= STATE_IDLE;
    GSMLeaveState	= STATE_IDLE;
    GSMRenetState	= STATE_IDLE;
    GSMCloseState	= STATE_IDLE;
    GSMClearState	= STATE_IDLE;

    GSMSendDataStep	= STATE_IDLE;
    GSMSendCommStep	= STATE_IDLE;

    GSMCenterFlag	= FALSE;
    GSMBlockState	= FALSE;
    GSMBlockTimer	= 0;
    GSMEnterCount	= 0;
    GSMBreakCount	= 0;

    GSMRadioState	= RADIO_IDLE;
    GSMPinRIState	= FALSE;
    GSMPinRICount	= 10;

    SMSReadState	= STATE_IDLE;
    SMSSendState	= STATE_IDLE;
    SMSHeadState	= STATE_IDLE;
    SMSTailState	= STATE_IDLE;

    SMSReadIndex	= 1;
    SMSSendRetry	= 5;

    SMSSendFI		= 0;
    SMSSendFO		= 0;
    SMSReadFI		= 0;
    SMSReadFO		= 0;

    SMSGuardData	= SMS_GRD_INIT;
    SMSGuardWarn	= SMS_GRD_INIT;

    SMSEmptyIndex	= 1;
    SMSEmptyCount	= 20;
    SMSEmptyTimer	= SMS_EMPTY_INTERVAL;
    SMSBlockState	= FALSE;
    SMSGuardState	= FALSE;

    GSMInitGPRS		= FALSE;
    GSMLinkGPRS		= FALSE;
#ifdef SUPPORT_TAXI_FUNCTION
    GSMRingGPRS		= FALSE;
#endif

    for (i = 0; i < CGD_COUNT_MAX; i++) {
	CGDCountState[i] = FALSE;
    }
}

void GSMInitGPIO()
{
    GSM_POWER_HI;

//  Output mode
    GPIO_G_SET(3, 1, 1 << (GSM_DTR - 48));
//  GPIO_G_SET(2, 1, 1 << (GSM_CTS - 32));
    GSM_DTR_HI;
//  GSM_CTS_HI;

//  Input mode
    GPIO_G_SET(1, 0, 1 << (GSM_DSR - 16));
    GPIO_G_SET(2, 0, 1 << (GSM_RI  - 32));
//  GPIO_G_SET(2, 0, 1 << (GSM_CTS - 32));
//  GPIO_G_SET(2, 0, 1 << (GSM_RTS - 32));

    InitUserBuff();
//  GSMRoundState = GSM_POWER_PROC;
    GSMRoundState = GSM_SLEEP_PROC;
}

/************************************************************************
 *	GSM Uart Code							*
 ************************************************************************/
void GSMUsartSend(BYTE *Data, BYTE Len)
{
#ifdef SUPPORT_USART_SHOW
    BYTE		i;
#endif

    if (Len) {
	UartSend(Data, Len);

#ifdef SUPPORT_USART_SHOW
	if (GSMRoundState == GSM_STATE_GPRS) {
	    for (i = 0; i < Len; i++) {
		DBusEditSetColor(MAP_COLOR_BLUE);
		psprintf(LineBuffer, "%02x", Data[i]);
		DBusEditShowText(LineBuffer);
	    }
	}
	else
	if (GSMRoundState != GSM_CHECK_PROC) {
	    strcpylen(LineBuffer, Data, Len);
	    DBusEditSetColor(MAP_COLOR_BLUE);
	    DBusEditShowText(LineBuffer);
	}
#endif
    }
}

BYTE GSMUsartRead()
{
    return UartRecv(GSMReadBuff + GSMReadSize, UART_RECV_SIZE);
}

/************************************************************************
 *  GSM Read Usart Data							*
 *	Read Usart Data from the GSM Module				*
 ************************************************************************/
BYTE GSMReadUsart(void)
{
    BYTE		Size;
#ifdef SUPPORT_USART_SHOW
    BYTE		i;
#endif

    Size = GSMUsartRead();
    if (Size) {
#ifdef SUPPORT_USART_SHOW
	if (GSMRoundState == GSM_STATE_GPRS) {
	    for (i = 0; i < Size; i++) {
		DBusEditSetColor(MAP_COLOR_RED);
		psprintf(LineBuffer, "%02x", GSMReadBuff[GSMReadSize + i]);
		DBusEditShowText(LineBuffer);
	    }
	}
	else
	if (GSMRoundState != GSM_CHECK_PROC) {
	    strcpylen(LineBuffer, GSMReadCurr, Size);
	    DBusEditShowText(LineBuffer);
	}
#endif
	GSMReadSize += Size;
	GSMReadBuff[GSMReadSize] = NUL;

	if (GSMReadSize >= GSM_READ_BUFF_SIZE - UART_RECV_SIZE) {
	    InitReadBuff();
	}
    }

    return Size;
}

/************************************************************************
 *  GSM Wait Modem Reply						*
 *	Wait Modem Reply from the GSM Module				*
 ************************************************************************/
BYTE GSMReadModemSense(void)
{
    UINT16		i;
    UINT16		Len;
    BYTE		Num;

    if (GSMReadUsart() || GSMSaveSize != GSMReadSize) {
	GSMSaveSize   = GSMReadSize;
	GSMSenseTimer = TIMER_mS(200);
	return IDLE;
    }

    if (GSMSenseTimer == 0) {
	GSMSaveSize = 0;

	if ((PtrTempAddr = strstr(GSMReadBuff, (BYTE *)cStrGSMRING)) != NULL) {
	    memcopy(PtrTempAddr, PtrTempAddr + LenGSMRING,
		    GSMReadSize - (PtrTempAddr - GSMReadBuff) - LenGSMRING + 1);
	    GSMReadSize	-= LenGSMRING;
#ifdef SUPPORT_USART_SHOW
	    psprintf(LineBuffer, "RING,");
	    DBusEditShowText(LineBuffer);
#endif
	    return RING;
	}

	if ((PtrTempAddr = strstr(GSMReadBuff, (BYTE *)cStrGSMCMTI)) != NULL &&
	    (IsDigit(PtrTempAddr[LenGSMCMTI]))) {
	    Num = PtrTempAddr[LenGSMCMTI] - '0';
	    Len = LenGSMCMTI + 1 + 2;
	    if (IsDigit(PtrTempAddr[LenGSMCMTI + 1])) {
		Num *= 10;
		Num += PtrTempAddr[LenGSMCMTI + 1] - '0';
		Len = LenGSMCMTI + 2 + 2;
	    }
	    if (PtrTempAddr[Len - 2] == CR && PtrTempAddr[Len - 1] == LF) {
		memcopy(PtrTempAddr, PtrTempAddr + Len,
			GSMReadSize - (PtrTempAddr - GSMReadBuff) - Len + 1);
		GSMReadSize -= Len;
#ifdef SUPPORT_USART_SHOW
		psprintf(LineBuffer, "CMTI:%02d,", Num);
		DBusEditShowText(LineBuffer);
#endif
		GSMReadCommPara	= Num;
		return CMTI;
	    }
	}

	if ((PtrTempAddr = strstr(GSMReadBuff, (BYTE *)cStrGSMCLIP)) != NULL &&
	    (PtrTempAddr[LenGSMCLIP] == '\"')) {
	    GSMReadAddr	= PtrTempAddr - GSMReadBuff;
	    for (i = GSMReadAddr + LenGSMCLIP + 2; i <= GSMReadSize; i++) {
		if (GSMReadBuff[i - 2] == CR && GSMReadBuff[i - 1] == LF) {
		    GSMReadStop = i;
		    StrCurr = PtrTempAddr + LenGSMCLIP + 1;
		    if ((StrNext = strchr(StrCurr, '\"')) != NULL &&
			(StrNext - StrCurr) <= LenGSMDailerTXT) {
			strcpylen(StrGSMDailerTXT, StrCurr, StrNext - StrCurr);
#ifdef SUPPORT_USART_SHOW
			psprintf(LineBuffer, "CLIP:%s,", StrGSMDailerTXT);
			DBusEditShowText(LineBuffer);
#endif
			memcopy(GSMReadBuff + GSMReadAddr,
				GSMReadBuff + GSMReadStop, GSMReadSize - GSMReadStop + 1);
			GSMReadSize -= GSMReadStop - GSMReadAddr;
			return CLIP;
		    }
		}
	    }
	}

	if ((PtrTempAddr = strstr(GSMReadBuff, (BYTE *)cStrGSMECAV)) != NULL &&
	    (IsDigit(PtrTempAddr[LenGSMECAV]))) {
	    GSMReadAddr	= PtrTempAddr - GSMReadBuff;
	    for (i = GSMReadAddr + LenGSMECAV + 2; i <= GSMReadSize; i++) {
		if (GSMReadBuff[i - 2] == CR && GSMReadBuff[i - 1] == LF) {
		    GSMReadStop = i;
		    if (IsDigit(PtrTempAddr[LenGSMECAV + 2])) {
			GSMPhoneValue = PtrTempAddr[LenGSMECAV + 2] - '0';
#ifdef SUPPORT_USART_SHOW
			psprintf(LineBuffer, "ECAV:%d,", GSMPhoneValue);
			DBusEditShowText(LineBuffer);
#endif
			memcopy(GSMReadBuff + GSMReadAddr,
				GSMReadBuff + GSMReadStop, GSMReadSize - GSMReadStop + 1);
			GSMReadSize -= GSMReadStop - GSMReadAddr;
			return ECAV;
		    }
		}
	    }
	}

	if ((PtrTempAddr = strstr(GSMReadBuff, (BYTE *)cStrGSMOK)) != NULL) {
	    memcopy(PtrTempAddr, PtrTempAddr + LenGSMRING,
		    GSMReadSize - (PtrTempAddr - GSMReadBuff) - LenGSMOK + 1);
	    GSMReadSize	-= LenGSMOK;

⌨️ 快捷键说明

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