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

📄 rs232.c

📁 RTL8019以太网开发板资料
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************
FileName:      RS232.c
Description:   RS232 protocol process  
Date:          2007 09 21                                                       
************************************************************************/
#include "Main.h"
#include "EEPROM.h"
/************************************************************************/
bit Rcv_flag;			   //串口接收到正确的标志位
bit Rcv_ok;					//串口接收过完成的标志位
bit Key_flag;					//按键标志位
WORK16 RcvDelayCount;		//按键延时记数器
WORK16 KeyDelayCount;		//按键延时记数器
UWORK16  RcvCount;                        			     // 接收记数器
UWORK16  RcvLen;                        			     // 接收长度 
UWORK8   gucSerialRcvStatus;                               // 串口接收状态 
xdata  UWORK8 Rcv_buf[UART_RCV_NUM];
xdata ST_UART_STATISTICS gstUARTStatistics;                      // 串口通信错误统计 
xdata WORK16   gsaSystemTimer[12];                 // 系统相对定时器
/*********************************************************************/
     /* 网口参数 */
xdata UWORK8  gucaNetPara[NET_PARA_LEN];
xdata UWORK8  gucOpenCount;                                      /* 3秒计数 */
xdata UWORK8  gucSecond;                                         /* 系统运行时间,秒 */
xdata UWORK8  gucMinute;                                         /* 系统运行时间,分钟 */
xdata UWORK8  gucHour;                                           /* 系统运行时间,小时 */
xdata UWORK16 gusDate;                                           /* 系统运行时间,天数 */
xdata UWORK16 gusStopRun;

/*********************************************************************
函数名:       void SystemTimerProc()
功能:         相对定时器处理
输入:         None 
输出:         None
返回:         None
日期:         2004/02/09
*********************************************************************/
void SystemTimerProc(void)
{
    UWORK8   ucTimerNum; 
    UWORK8   ucResult,ucValue,ucValue1;   
    WORK16 ssTemp;
   
    for( ucTimerNum =0 ; ucTimerNum < 12; ucTimerNum++ )
    {
        WDTCONTR |= CLR_WDT;   //复位看门狗定时器
        if(gsaSystemTimer[ucTimerNum] != 0)                      /* 是否启动了该定时器 */
        {
            ET0 = FALSE;    // 禁止timer0中断 
            gsaSystemTimer[ucTimerNum] -= gusMsTick;
            ET0 = TRUE;   // 使能timer0中断
            if(gsaSystemTimer[ucTimerNum] <= 0)                  /* 定时是否到 */
            {
                switch(ucTimerNum)
                {
				    case 0:
                        ssTemp = 100 + gsaSystemTimer[ucTimerNum];    // 运行灯1秒闪烁,可能已经超过了一些时间,加上一个负数作为校正 
                        if(ssTemp > 0)                                //可能发生极为罕见的情况就是为0,意外停止定时器,在此做一个判断 
                        {
                            StartTimer(ucTimerNum,ssTemp);
                        }
                        else
                        {
                            StartTimer(ucTimerNum,1);
                        }
                        if(IPOrMacConfiltFlag)
                        {                                             // IP或MAC有冲突,运行灯快闪                
                            if(FALSE == StartConfiltLedFlag)
                            {
                                StartTimer(17,25);
                                StartConfiltLedFlag = TRUE;
                            }
                        }
                        else
                        {
                            if(StartConfiltLedFlag)
                            {
                                StopTimer(17);
                                StartConfiltLedFlag = FALSE;
                            }
                            Led = ~Led;                           // 无冲突时1s闪烁 
                        }
                        
                        if(0 == Key)                           // 使用按钮对设置进行复位
                        {
                            if(++gucOpenCount > 3)                    // 按住3秒进行复位 
                            {
                                FlashInit();                      // 初始化FLASH 
                                ResetSystem();
                            }
                        }
                        else
                        {
                            gucOpenCount = 0;
                        }            
                                    // 运行时间计数 
                        if(++gucSecond >= 60)                         // 是否到了1分钟 
                        {
                            gucSecond = 0;
                            if(++gucMinute >= 60)                     // 是否到了1小时 
                            {
                                gucMinute = 0;
                                if(++gucHour >= 24)                   // 是否到了一天 
                                {
                                    gucHour = 0;
                                    gusDate++;                        // 天数加1 
                                }
                            }
                        }
                        break;
                    case 1: 
						ES = FALSE;  // 禁止串口中断
						StopTimer(ucTimerNum);                        /* 串口帧错误延时 */
                        gucSerialRcvStatus    = RCV_SOI;              /* 接收起始码 */
                        RcvCount = 0;
                        REN = TRUE;    // 串口接收使能
                        ES = TRUE;       // 使能串口中断
                        break;
                    case 4:                                           /* ARP高速缓存指针操作 */
                        StopTimer(ucTimerNum);
                        ArpCachePoniter++;
                        StartTimer(7,2);
                        break;
                        
                    case 5:                                           /* IP冲突检测超时 */
                        StopTimer(ucTimerNum);
                        IPConflitTestFlag = FALSE;                    /* 退出测试状态 */
                        IPOrMacConfiltFlag = FALSE;               /* 防止对方关机没有回应时可以关闭快闪 */
                        IpOrRouter();                                 /* 将目的IP的状态改为'f' */
                        
                        StartTimer(7,10);                             /* 冲突检测后,进行ARP */
                        ArpCachePoniter = 0;
                        ArpPhases = ARP_FIRST_REQUEST;
                        break;

                    case 6:                                           /* ARP老化超时 */
                        StopTimer(ucTimerNum);
                        if(++gucARPOddNum > ARP_OLD_NUM)              /* 如果老化后,3次ARP不成功就认为目的主机或网络出现了问题 */
                        {
                            gucARPOddNum = 0;
                            ArpCache_Buf[ArpCachePoniter].ucStatus = 'f';            /* 异常情况,重赋初值 */
                            StartTimer(7,2);
                            ArpCachePoniter++;                           
                            ARPFinishFlag = FALSE;                  /* 检验是否全部ARP不成功 */
                            for(ucValue = 0; ucValue < IpModeNum; ucValue++)
                            {
                                if('r' == ArpCache_Buf[ucValue].ucStatus)
                                {
                                    ARPFinishFlag = TRUE;
                                    break;
                                }
                            }
                        }
                        else
                        {
                            ArpRequest(&ArpCache_Buf[ArpCachePoniter].ucaArpIp[0]);       /* 再次启动ARP */
                            StartTimer(ucTimerNum,200);
                        }
                        break;

                    case 7:
                        StopTimer(ucTimerNum);
                        if(FALSE == EthernetLinkFlag)                 /* 没有LINK上,停止ARP请求 */
                        {
                            StopArpCounter();
                            break;
                        }

                        switch(ArpPhases)
                        {
                            case ARP_FIRST_REQUEST:                   /* ARP第一次请求 */
                                if(ArpCachePoniter < IpModeNum)
                                {
                                    if(ArpCache_Buf[ArpCachePoniter].ucIPValible)    /* 是否为一个合法IP */
                                    {
                                        if('f' == ArpCache_Buf[ArpCachePoniter].ucStatus)
                                        {
                                            StartTimer(4,10);         /* 还没有进行过ARP请求,每100ms进行一个IP */
                                            ArpCache_Buf[ArpCachePoniter].ucStatus = 'p';
                                            ArpRequest(&ArpCache_Buf[ArpCachePoniter].ucaArpIp[0]);                   /* ARP请求 */
                                        }
                                        else
                                        {
                                            ArpCachePoniter++;
                                            StartTimer(ucTimerNum,2); /* 启动定时器进行下一个远程IP的ARP */
                                        }
                                    }
                                    else
                                    {
                                       
                                        ArpCachePoniter++;          /* 非法的IP */
                                        StartTimer(ucTimerNum,2);      /* 启动定时器进行下一个远程IP的ARP */
                                    }
                                }
                                else
                                {
                                    StartTimer(ucTimerNum,400);
                                    ArpCachePoniter = 0;
                                    ArpPhases = ARP_SECOND_REQUEST; /* 没有ARP成功的IP需要再请求一次 */
                                }
                                break;

                            case ARP_SECOND_REQUEST:                  /* 没有成功的IP,再次进行ARP */
                                if(ArpCachePoniter < IpModeNum)
                                {
                                    if('p' == ArpCache_Buf[ArpCachePoniter].ucStatus)
                                    {
                                        StartTimer(4,10);             /* 第二次进行过ARP请求,每100ms进行一个IP */
                                        ArpCache_Buf[ArpCachePoniter].ucStatus = 'f';    /* 如果ARP成功,在ARP中将置为"r",否则为下一次ARP做准备 */
                                        ArpRequest(&ArpCache_Buf[ArpCachePoniter].ucaArpIp[0]);
                                    }
                                    else
                                    {
                                        ArpCachePoniter++;
                                        StartTimer(ucTimerNum,2);     /* 启动定时器进行下一个远程IP的ARP */
                                    }
                                }
                                else
                                {
                                    StartTimer(ucTimerNum,2000);
                                    ArpCachePoniter = 0;
                                    ArpPhases = ARP_OLD;            /* ARP进入老化阶段 */
                                }
                                break;

                            case ARP_OLD:                             /* ARP老化 */
                                if(ArpCachePoniter < IpModeNum)
                                {
                                    if('r' == ArpCache_Buf[ArpCachePoniter].ucStatus)
                                    {
                                        StartTimer(6,100);            /* 发出请求后1秒没有响应说明目的网络或主机出现了问题.ARP成功后在ARP.C中关闭定时器6 */                   
                                        ArpRequest(&ArpCache_Buf[ArpCachePoniter].ucaArpIp[0]);                   /* ARP请求 */
                                    }
                                    else
                                    {
                                        ArpCachePoniter++;
                                        StartTimer(ucTimerNum,2);     /* 启动定时器进行下一个远程IP的ARP */
                                    }
                                }
                                else
                                {
                                    StartTimer(ucTimerNum,20);
                                    ArpCachePoniter = 0;

⌨️ 快捷键说明

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