📄 rs232.c
字号:
/************************************************************************
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 + -