📄 output.c
字号:
返回:无
************************************************************************************************************/
void WsSerialRecieve() interrupt 4 using 3 //注意:这个函数在程序里面没有用到,但是删除后有问题,暂时我们也不知道什么原因!
{
if(RI)
{
uchar ch;
RI = 0;
ch = SBUF;
if(ch==0x3E) //若第一个字符为数据开始字符">"。
{
FlagStartRecv=1; //开始接收标志置位。
RecvDataCount = -1; //第一个字符不接收。
}
if(FlagStartRecv) //若可以开始接收
{
if(RecvDataCount >=0) //若接收的个数大于0,验证接收个数的有效性。
{
RecvDataBuff[RecvDataCount]=ch; //保存接收的数据
}
RecvDataCount++; //接收的个数加一
if(RecvDataCount > (RecvDataSize-1)) //如果接收的数据已经接收完毕
{
FlagProcessRecvData=1; //FlagProcessRecvData置位,通知函数来打包该数据。
FlagStartRecv=0; //开始接收标识复位,暂时不接受外设数据。
RecvDataCount=-1; //接收个数也复位为-1.
}
}
}
}
/***********************************************************************************************************
功能:CopyToMyRam,从公共RAM里拷贝相应的数据到自己的RAM。
描述:实现从公共RAM里通过数组CopyBuff[COPYLEN]拷贝数据到自己的RAM,如果长度不超过缓冲区长度就一次拷贝过去,假
如长度超过缓冲区长度就分几次拷贝过去。
参数:address1--自带RAM命令起始地址 address2--公共RAM命令起始地址 lenght--命令字节长度
返回:无
************************************************************************************************************/
void CopyToMyRam(uint address1,uint address2,uint length)
{
xdata uchar CopyBuff[COPYLEN]; //缓冲区数组。
uchar i,len1,len2;
len1=(uchar)(length / COPYLEN); //拷贝的次数。
len2=(uchar)(length % COPYLEN); //拷贝的余数。
if(length>0) //验证length的有效性。
{
if(length>COPYLEN) //length大于缓冲区的长度
{
for(i=0;i<len1;i++)
{
ComReadBytes(address1,CopyBuff,COPYLEN);
MyWriteBytes(address2,CopyBuff,COPYLEN);
address1 += COPYLEN ;
address2 += COPYLEN ;
}
ComReadBytes(address1,CopyBuff,len2);
MyWriteBytes(address2,CopyBuff,len2);
}
else //length小于缓冲区的长度。
{
ComReadBytes(address1,CopyBuff,length);
MyWriteBytes(address2,CopyBuff,length);
}
}
}
/***********************************************************************************************************
功能:CopyAllToMyRam(),把公共RAM中所有相应的数据拷贝到再带RAM中去。
描述:实现把公共RAM中所有相应的数据拷贝到再带RAM中去,主要是拷贝服务器发来的存储在公共RAM中的命令。
参数:无
返回:无
************************************************************************************************************/
void CopyAllToMyRam()
{
uchar len = 0;
len = ComReadOneByte(ComAlarmLenAdd1); //取出公共RAM中从机1报警动作号的长度。
if((len > 0) && (len <= MaxSlaveAlarmLen))
{
CopyToMyRam(ComAlarmStart1,Ws1Alarm,len); //再把公共RAM中从机1报警动作号拷贝到输出机自带RAM中去。
MyWriteOneByte(Ws1AlarmLen,len); //再把公共RAM中从机1报警动作号长度拷贝到输出机自带RAM中去。
ComWriteOneByte(ComAlarmLenAdd1,0x00); //再把公共RAM中从机1报警动作号长度置0。
}
len = ComReadOneByte(ComAlarmLenAdd2); //取出公共RAM中从机2报警动作号的长度。
if((len > 0) && (len <= MaxSlaveAlarmLen))
{
CopyToMyRam(ComAlarmStart2,Ws2Alarm,len); //再把公共RAM中从机2报警动作号拷贝到输出机自带RAM中去。
MyWriteOneByte(Ws2AlarmLen,len); //再把公共RAM中从机2报警动作号长度拷贝到输出机自带RAM中去。
ComWriteOneByte(ComAlarmLenAdd2,0x00); //再把公共RAM中从机2报警动作号长度置0。
}
len = ComReadOneByte(ComAlarmLenAdd3); //取出公共RAM中从机3报警动作号的长度。
if((len > 0) && (len <= MaxSlaveAlarmLen))
{
CopyToMyRam(ComAlarmStart3,Ws3Alarm,len); //再把公共RAM中从机3报警动作号拷贝到输出机自带RAM中去。
MyWriteOneByte(Ws3AlarmLen,len); //再把公共RAM中从机3报警动作号长度拷贝到输出机自带RAM中去。
ComWriteOneByte(ComAlarmLenAdd3,0x00); //再把公共RAM中从机3报警动作号长度置0。
}
len = ComReadOneByte(ComAlarmLenAdd4); //取出公共RAM中从机4报警动作号的长度。
if((len > 0) && (len <= MaxSlaveAlarmLen))
{
CopyToMyRam(ComAlarmStart4,Ws4Alarm,len); //再把公共RAM中从机4报警动作号拷贝到输出机自带RAM中去。
MyWriteOneByte(Ws4AlarmLen,len); //再把公共RAM中从机4报警动作号长度拷贝到输出机自带RAM中去。
ComWriteOneByte(ComAlarmLenAdd4,0x00); //再把公共RAM中从机4报警动作号长度置0。
}
len = ComReadOneByte(ComAlarmLenAdd5); //取出公共RAM中从机5报警动作号的长度。
if((len > 0) && (len <= MaxSlaveAlarmLen))
{
CopyToMyRam(ComAlarmStart5,Ws5Alarm,len); //再把公共RAM中从机5报警动作号拷贝到输出机自带RAM中去。
MyWriteOneByte(Ws5AlarmLen,len); //再把公共RAM中从机5报警动作号长度拷贝到输出机自带RAM中去。
ComWriteOneByte(ComAlarmLenAdd5,0x00); //再把公共RAM中从机5报警动作号长度置0。
}
}
/***********************************************************************************************************
功能:OutputAction(),处理报警动作号。
描述:实现动作号的输出。
参数:act---报警动作号
返回:无
************************************************************************************************************/
void OutputAction(uchar act)
{
uchar action = act;
switch(act)
{
case ACTION1:
{
SendCharCom(action);
}
break;
case ACTION2:
{
SendCharCom(action);
}
break;
case ACTION3:
{
SendCharCom(action);
}
break;
case ACTION4:
{
SendCharCom(action);
}
break;
case ACTION5:
{
SendCharCom(action);
}
break;
case ACTION6:
{
SendCharCom(action);
}
break;
case ACTION7:
{
SendCharCom(action);
}
break;
case ACTION8:
{
SendCharCom(action);
}
break;
case ACTION9:
{
SendCharCom(action);
}
break;
case ACTION10:
{
SendCharCom(action);
}
break;
case ACTION11:
{
SendCharCom(action);
}
break;
case ACTION12:
{
SendCharCom(action);
}
break;
default:
SendCharCom(0xFF);
break;
}
}
/***********************************************************************************************************
功能:ProcessAlarm(),处理报警动作号。
描述:通过单片机的输出口输出给继电器,实现对报警动作号的处理。
参数:无
返回:无
************************************************************************************************************/
void ProcessAlarm()
{
uchar len = 0;
uchar result = 0;
uchar i = 0;
uint address = 0;
len = MyReadOneByte(Ws1AlarmLen); //取出从机1的报警动作号的个数。
if(len > 0)
{
address = Ws1Alarm; //赋值从机1动作号的开始地址。
for(i=0;i<len;i++)
{
address = Ws1Alarm + i; //更新取从机1动作号的地址。
result = MyReadOneByte(address); //取出从机1的报警动作。
OutputAction(result); //处理从机1的报警动作号。
}
MyWriteOneByte(Ws1AlarmLen,0x00); //取出从机1的报警动作号的个数。
}
len = MyReadOneByte(Ws2AlarmLen); //取出从机2的报警动作号的个数。
if(len > 0)
{
address = Ws2Alarm; //赋值从机2动作号的开始地址。
for(i=0;i<len;i++)
{
address = Ws2Alarm + i; //更新取从机2动作号的地址。
result = MyReadOneByte(address); //取出从机2的报警动作。
OutputAction(result); //处理从机2的报警动作号。
}
MyWriteOneByte(Ws2AlarmLen,0x00); //取出从机2的报警动作号的个数。
}
len = MyReadOneByte(Ws3AlarmLen); //取出从机3的报警动作号的个数。
if(len > 0)
{
address = Ws3Alarm; //赋值从机3动作号的开始地址。
for(i=0;i<len;i++)
{
address = Ws3Alarm + i; //更新取从机2动作号的地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -