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

📄 dlcrecv.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/****************************************************************
**                                                              *
**  FILE         :  DLCRecv.C                                   *
**  COPYRIGHT    :  (c) 2001 .Xiamen Yaxon NetWork CO.LTD       *
**                                                              *
**                                                              *
**  By : CCH 2002.11.26                                         *
****************************************************************/
#define  SRC_DLCRECV

#include "includes.h"
#include "bsp.h"
#include "timetask.h"
#include "crc.h"
#include "dlcs.h"			     
#include "dlcrecv.h"
#include "hardware.h"
#include "ZPrint.h"


/*
********************************************************************************
*                  DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define PERIOD_SCAN                         MILTICK, 1          /* PERIOD_SCAN    = 1 tick */
#define PERIOD_MONITOR                      SECOND,  3          /* PERIOD_MONITOR = 3 seconds */


/*
********************************************************************************
*                  DEFINE Receive step
********************************************************************************
*/
#define STEP_RECV_FLAG_S                    -5                  /* recv flag (start)            */
#define STEP_RECV_ADDR                      -4                  /* recv addr                    */
#define STEP_RECV_TYPE                      -3                  /* recv type                    */
#define STEP_RECV_LEN_L                     -2                  /* recv len  (low  byte)        */
#define STEP_RECV_LEN_H                     -1                  /* recv len  (high byte)        */
#define STEP_RECV_FLAG_E                    -6                  /* recv flag (end)              */
#define STEP_RECV_FLAG_ERR                  -7                  /* recv flag (when crc error)   */


/*
********************************************************************************
*                  DEFINE MODULE VARIANT
********************************************************************************
*/
static TMR_TSK *monitortmr, *scantmr;



static void MonitorTmrProc(void)
{
    #if DEBUG_DLC_STATUS > 0
    PrintFromUART(DEBUG_UARTNo_DLC, "<sorry, DLC timer overflow>\n");
    #endif

    ResetDLCRecv();
    StopTmr(monitortmr);
}

static void ScanTmrProc(void)
{
    INT8S   dlci;
    INT16S  ch;
    INT16U  temp;

    #if DEBUG_DLC_IO > 0

    BOOLEAN firstread;
    #endif


    StartTmr(scantmr, PERIOD_SCAN);
    if ((dlci = GetShieldedDLC()) != -1) {
        #if DEBUG_DLC_IO > 0
        firstread = TRUE;
        #endif

        while((ch = ReadDLCIO()) != -1) {
            #if DEBUG_DLC_IO > 0
            if (firstread) {
                firstread = FALSE;
                PrintFromUART(DEBUG_UARTNo_DLC, "\nDLC recv: ");
            }
            SendFromUART_HEX(DEBUG_UARTNo_DLC, ch);
            #endif
            WriteDLCRecvRound(dlci, ch);
        }
        return;
    }

    #if DEBUG_DLC_IO > 0
    firstread = TRUE;
    #endif
    while((ch = ReadDLCIO()) != -1) {
        #if DEBUG_DLC_IO > 0

        if (firstread) {
            firstread = FALSE;
            PrintFromUART(DEBUG_UARTNo_DLC, "\nDLC recv: ");
        }
        SendFromUART_HEX(DEBUG_UARTNo_DLC, ch);
        #endif

        switch(DLCRecv.recvlen)
        {
            case STEP_RECV_FLAG_ERR:
                ResetDLCRecv();
                break;
            case STEP_RECV_FLAG_E:                          /* receive end flag */
                if (ch == DLC_FLAG) {
                    /* receive one frame success */
                    HdlDLCRecv();                           /* handle DLC receive frame */
                }
                ResetDLCRecv();
                break;
            case STEP_RECV_FLAG_S:                          /* receive start flag */
                if (ch == DLC_FLAG) {
                    InitCrc(&DLCRecv.crc);
                    DLCRecv.recvlen = STEP_RECV_ADDR;
                    StartTmr(monitortmr, PERIOD_MONITOR);   /* start monitor timer */
                }
                break;
            case STEP_RECV_ADDR:                            /* receive address */
                if (ch != DLC_FLAG) {
                    CalcCrcByByte(&DLCRecv.crc, ch);
                    DLCRecv.addr    = ch;
                    DLCRecv.recvlen = STEP_RECV_TYPE;
                }
                break;
            case STEP_RECV_TYPE:                            /* receive type */
                CalcCrcByByte(&DLCRecv.crc, ch);
                DLCRecv.type    = ch;
                #if GSM_BENQ
	        DLCRecv.recvlen = 0;
		DLCRecv.len = 0xffff;
		#else
                DLCRecv.recvlen = STEP_RECV_LEN_L;
                #endif
                break;
            case STEP_RECV_LEN_L:                           /* receive low byte of length */
                CalcCrcByByte(&DLCRecv.crc, ch);
                if (ch & 0x01) {
                    DLCRecv.len     = ch >> 1;
                    DLCRecv.recvlen = 0;
                } else {
                    DLCRecv.len     = ch;
                    DLCRecv.recvlen = STEP_RECV_LEN_H;
                }
                break;
            case STEP_RECV_LEN_H:                           /* receive high byte of length */
                CalcCrcByByte(&DLCRecv.crc, ch);
                temp            = ch;
                temp          <<= 8;
                DLCRecv.len    |= temp;
                DLCRecv.len   >>= 1;
                DLCRecv.recvlen = 0;
                break;
            default:
                #if GSM_BENQ
                if ((DLC_FLAG == ch)) {
                    EndCrc(&DLCRecv.crc);
                    if(DLCRecv.inf[DLCRecv.recvlen-1]==DLCRecv.crc){
                       DLCRecv.len=DLCRecv.recvlen;
                       HdlDLCRecv();
		       ResetDLCRecv();
		    }else{
		        #if DEBUG_DLC_STATUS > 0
                        PrintFromUART(DEBUG_UARTNo_DLC, "<sorry, DLC CRC error>\n");
                        #endif
			ResetDLCRecv();
		    }

                }
                #else
                if (DLCRecv.recvlen == DLCRecv.len) {       /* receive FCS */
                    EndCrc(&DLCRecv.crc);
                    if (DLCRecv.crc == ch) {                /* check crc */
                        DLCRecv.recvlen = STEP_RECV_FLAG_E;
                    } else {
                        #if DEBUG_DLC_STATUS > 0
                        PrintFromUART(DEBUG_UARTNo_DLC, "<sorry, DLC CRC error>\n");
                        #endif
                        DLCRecv.recvlen = STEP_RECV_FLAG_ERR;
                    }
                }
              #endif

                else {                                    /* receive information field */
                    if (DLCRecv.recvlen < sizeof(DLCRecv.inf)) {
                        DLCRecv.inf[DLCRecv.recvlen++] = ch;
                    } else {
                        #if DEBUG_DLC_STATUS > 0
                        PrintFromUART(DEBUG_UARTNo_DLC, "<sorry, DLC data is too long>\n");
                        #endif
                        ResetDLCRecv();
                    }
                }
                break;
        }
    }
}

void ResetDLCRecv(void)
{
    DLCRecv.recvlen = STEP_RECV_FLAG_S;
    StopTmr(monitortmr);
}

void InitDLCRecv(void)
{
    scantmr    = CreateTimer(ScanTmrProc, 0);
    monitortmr = CreateTimer(MonitorTmrProc, 0);
    ResetDLCRecv();
    StartTmr(scantmr, PERIOD_SCAN);
}

⌨️ 快捷键说明

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