📄 rs232.c
字号:
UWORK8 ucResult, ucValue,ucValue1;
WORK16 ssTemp;
for( TimerType =0 ; TimerType < 12; TimerType++ )
{
WDTCONTR |= CLR_WDT; //复位看门狗定时器
if(SystemTimer_buf[TimerType] != 0) // 是否启动了该定时器
{
ET0 = FALSE; // 禁止timer0中断
SystemTimer_buf[TimerType] -= Ms10FlagCount; //减10ms
ET0 = TRUE; // 使能timer0中断
if(SystemTimer_buf[TimerType] <= 0) // 定时是否到
{
switch(TimerType)
{
case 0: //1秒定时器
ssTemp = 100 + SystemTimer_buf[TimerType]; // 运行灯1秒闪烁,可能已经超过了一些时间,加上一个负数作为校正
if(ssTemp > 0) //可能发生极为罕见的情况就是为0,意外停止定时器,在此做一个判断
{
StartTimer(TimerType,ssTemp);
}
else
{
StartTimer(TimerType,1);
}
tcp_inactivity(); //判断TCP连接状态
judgeIPState(); //判断IP的状态
key_judge(); //按键判断
runTimeStat(); //统计系统运行的总时间
break;
case 1: //定进
StopTimer(TimerType);
tcp_retransmit();
StartTimer(TimerType,200); //定进两秒中
case 4: // ARP高速缓存指针操作
StopTimer(TimerType);
ArpCachePoniter++;
StartTimer(7,2);
break;
case 5: //IP冲突检测超时
StopTimer(TimerType);
IPConflitTestFlag = FALSE; // 退出测试状态
IPOrMacConfiltFlag = FALSE; // 防止对方关机没有回应时可以关闭快闪
IpOrRouter(); // 将目的IP的状态改为'f'
StartTimer(7,10); // 冲突检测后,进行ARP
ArpCachePoniter = 0; //设置ARP指针为0
ArpPhases = ARP_FIRST_REQUEST; //设置ARP请求开始
break;
case 6: // ARP老化超时
StopTimer(TimerType);
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
{
ArpStartRequest(&ArpCache_Buf[ArpCachePoniter].ucaArpIp[0]); /* 再次启动ARP */
StartTimer(TimerType,200);
}
break;
case 7:
StopTimer(TimerType);
if(FALSE == EthernetLinkFlag) // 没有LINK上,停止ARP请求
{
StopArpCounter();
break;
}
judgeArpState();
break;
case 8:
StartTimer(TimerType,200); // 检测以太网的LINK状态
judgeNetState();
break;
case 9:
StartTimer(TimerType,(rand() & 0x7ff +1000)); /* UART芯片保护校验 */
/* Ethernet 芯片保护校验 */
Page2();
RTL8019asRead(R2_PSTART,ucResult);
RTL8019asRead(R2_PSTOP,ucValue);
RTL8019asRead(R2_RCR,ucValue1);
if((0x4c != ucResult) || (0x80 != ucValue) || (0xcc != ucValue1))
{
RTL8019asInit();
}
else
{
RTL8019asRead(R2_TCR,ucResult);
RTL8019asRead(R2_DCR,ucValue);
RTL8019asRead(R2_IMR,ucValue1);
if((0xe0 != ucResult) || (0xd8 != ucValue) || (0x0f != (ucValue1 & 0x7f)))
{
RTL8019asInit();
}
}
Page0();
break;
case 11:
StopTimer(TimerType);
break;
case 12: // IP冲突检测
StopTimer(TimerType);
ucResult = (TL0 & 0x0f);
DelayMs(ucResult + 1); // 启动发送ARP包,取随机数避免2边同时发送,产生碰撞.加1是防止为0,意外停止定时器 */
StopArpCounter();
IPConflitTestFlag = TRUE; // 进行IP冲突检测
ArpStartRequest(&IPLocalAddress_buf[0]); //发起ARP请求
break;
default:
break;
}
}
}
}
ET0 = FALSE; // 禁止timer0中断
Ms10FlagCount = 0; //清除记数器。
MS10_Flag = FALSE; //清除标志位
ET0 = TRUE; // 使能timer0中断
}
/*********************************************************************
函数名: UWORK8 StartTimer( UWORK8 ucTimer, UWORK16 usTimerValue )
功能: 启动相对定时器
输入: ucTick
输出: None
返回: TRUE or FALSE
日期: 2004/02/09
*********************************************************************/
UWORK8 StartTimer( UWORK8 ucTimer, UWORK16 usTimerValue )
{
if( ucTimer >= 12 )
{
return ERROR;
}
SystemTimer_buf[ucTimer] = (usTimerValue << 1);
return OK;
}
/*********************************************************************
函数名: bit StopTimer( UWORK8 ucTimer )
功能: 停止相对定时器
输入: ucTick
输出: None
返回: TRUE or FALSE
日期: 2004/02/09
*********************************************************************/
bit StopTimer( UWORK8 ucTimer )
{
if( ucTimer >= 12 )
{
return FALSE;
}
SystemTimer_buf[ucTimer] = 0;
return TRUE;
}
/*********************************************************************
函数名: Serial0_ISR()
功能: 串口0中断接收/发送数据程序
输入: 有字符从超级终端输入
输出: 解释输入的字符
返回: None
日期: 2004/02/09
*********************************************************************/
void Serial0_ISR() interrupt 4 using 1
{
UWORK8 ucValue;
if (TRUE == RI)
{
ucValue = SBUF; /* 从串口0缓冲读一个字节 */
RI = FALSE; //清除串口接收中断标志
Rcv_flag = TRUE;
Rcv_buf[RcvCount] = ucValue;
RcvCount++;
RcvLen = RcvCount;
RcvDelayCount = 0;
}
else if(TRUE == TI) //发送处理程序 */
{
TI = FALSE; // 清除串口发送中断标志 /* 清发送中断标志 */
}
}
/*********************************************************************
函数名: void SerialSendStart(UWORK8 *pucData,UWORK8 ucSendLen)
功能: 启动串口发送
输入: 向空调发送命令
参数: 发送数据指针;数据长度
输出: 启动串口发送数据
返回: none
日期: 2007/01/26
*********************************************************************/
void SerialSendbuf(UWORK8 *pucData,UWORK16 ucSendLen)
{
UWORK16 m;
ES = FALSE; // 禁止串口中断
Rs485En = TRUE; //485通信使能
for(m = 0; m < ucSendLen; m++)
{
TI = 0;
SBUF = *pucData;
while(TI == 0);
pucData++;
}
Rs485En = FALSE; //485通信使能
ES = TRUE; // 使能串口中断
}
/*********************************************************************
函数名: ExInt0_ISR()
功能: INT0中断服务程序
输入: 以太网芯片发出中断请求
输出: 接收,发送数据
返回: None
日期: 2004/08/18
*********************************************************************/
void ExInt0_ISR() interrupt 0 using 2
{
UWORK8 ucValue,ucRtlCR;
_nop_();
_nop_();
IE0 = FALSE; // 清除外部中断0标志位
RTL8019asRead(RW0_CR,ucRtlCR); /* 保存CR */
Page0();
RTL8019asRead(RW0_ISR,ucValue); /* 读取中断状态寄存器 */
RTL8019asWrite(RW0_ISR,0xff); /* 必须清除掉所有中断标志 */
ucValue &= (RW0_ISR_TXE | RW0_ISR_RXE | RW0_ISR_PTX | RW0_ISR_PRX); /* 发送完成,接收完成和发送错误,接收错误中断 */
/* 处理中断寄存器,在此不封装成一个函数,因为涉及到调用的花销以及指定寄存器组 */
if(ucValue & RW0_ISR_PTX) /* 数据包发送正确无误 */
{
EthernetBuf0DataFlag = 0; // 清除缓冲0有数据标志
}
if(ucValue & RW0_ISR_PRX) /* 接收数据正确无误 */
{
RTL8019asRcvNum++;
}
if(ucValue & RW0_ISR_TXE) /* 发送出现错误 */
{
EthernetBuf0DataFlag = 0; //清除缓冲0有数据标志
}
RTL8019asWrite(RW0_CR,ucRtlCR); /* 处理中断结束,恢复CR*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -