📄 slave.c
字号:
address1++; //地址向后移一个字节.
Len=MyReadOneByte(address1); //取出命令长度.
address1++; //地址向后移一个字节.
MyReadBytes(address1,ProcessBuff,Len); //然后把包读到ProcessBuff中。
SendStringCom(ProcessBuff,Len); //发送命令到外设。
address1+=Len; //更新地址.
break;
default:
break;
}
}
else //所取的命令不是该从机的处理情况
{
switch(BagFlagTemp) //判断包标识
{
case CmdWs: //若是外设参数包
Len=LenCmdWs-2; //取出除掉前3个字节之后的包的长度。
address1+=Len; //更新地址
break;
case CmdSlave: //若是从机参数包
Len=LenCmdSlave-2; //取出除掉前3个字节之后的包的长度。
address1+=Len; //更新地址
break;
case CmdWsControl: //若是外设控制包.
Len=MyReadOneByte(address1 + 2); //取出命令长度.
address1+=(Len+3); //更新地址.
break;
default:
break;
}
}
}
}
}
}
/***********************************************************************************************************
功能:SetBodeRate
描述:设置波特率,假设晶振为12MHZ
参数:boderate---波特率编号
返回:无
************************************************************************************************************/
void SetBodeRate(uchar boderate)
{
switch(boderate)
{
case 0x01: //2400
TH1=0xE6;
break;
case 0x02: //4800
TH1=0xF3;
break;
case 0x03: //9600
TH1=0xF9;
break;
default:
break;
}
TR1=1;//定时器1开
}
/***********************************************************************************************************
功能:Send7017Order,发送7017外设数据采集命令。
描述:通过外设号给7017类型的外设发送采集数据的命令。
参数:wsaddress---外设编号
返回:无
************************************************************************************************************/
void Send7017Order(uchar wsaddress)
{
switch(wsaddress)
{
case 01: //外设1
{
SendBuff[0]=0x23; SendBuff[1]=0x30; SendBuff[2]=0x31; SendBuff[3]=0x0D; //#01
}
break;
case 02: //外设2
{
SendBuff[0]=0x23; SendBuff[1]=0x30; SendBuff[2]=0x32; SendBuff[3]=0x0D; //#02
}
break;
case 03: //外设3
{
SendBuff[0]=0x23; SendBuff[1]=0x30; SendBuff[2]=0x33; SendBuff[3]=0x0D; //#03
}
break;
case 04: //外设4
{
SendBuff[0]=0x23; SendBuff[1]=0x30; SendBuff[2]=0x34; SendBuff[3]=0x0D; //#04
}
break;
case 05: //外设5
{
SendBuff[0]=0x23; SendBuff[1]=0x30; SendBuff[2]=0x35; SendBuff[3]=0x0D; //#05
}
break;
default:
break;
}
SendStringCom(SendBuff,4);
}
/***********************************************************************************************************
功能:Send7053Order,发送7053外设数据采集命令。
描述:通过外设号给7053类型的外设发送采集数据的命令。
参数:wsaddress---外设编号
返回:无
************************************************************************************************************/
void Send7053Order(uchar wsaddress)
{
switch(wsaddress)
{
case 01: //外设1
{
SendBuff[0]=0x40; SendBuff[1]=0x30; SendBuff[2]=0x31; SendBuff[3]=0x0D; //@01
}
break;
case 02: //外设2
{
SendBuff[0]=0x40; SendBuff[1]=0x30; SendBuff[2]=0x32; SendBuff[3]=0x0D; //@02
}
break;
case 03: //外设3
{
SendBuff[0]=0x40; SendBuff[1]=0x30; SendBuff[2]=0x33; SendBuff[3]=0x0D; //@03
}
break;
case 04: //外设4
{
SendBuff[0]=0x40; SendBuff[1]=0x30; SendBuff[2]=0x34; SendBuff[3]=0x0D; //@04
}
break;
case 05: //外设5
{
SendBuff[0]=0x40; SendBuff[1]=0x30; SendBuff[2]=0x35; SendBuff[3]=0x0D; //@05
}
break;
default:
break;
}
SendStringCom(SendBuff,4);
}
/***********************************************************************************************************
功能:WsSerialRecieve,接收外设发送来的数据。
描述:通过串口中断接收外设发送过来的数据,保存在RecvDataBuff数组里,数据接收完毕时通过标识FlagProcessRecvData
通知Process7017RecvData或者Process7053RecvData函数来打包接收的数据。
参数:无
返回:无
************************************************************************************************************/
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.
}
}
}
}
/***********************************************************************************************************
功能:Process7017RecvData,打包7017的外设数据。
描述:当外设为7017,且FlagProcessRecvData==1时,调用该函数来打包外设7017的数据,并且保存在相应的存储器中。
参数:wsaddress---外设编号
返回:无
***********************************************************************************************************/
void Process7017RecvData(uchar wsaddress)
{
uchar j=0,len=0; //通道值
uchar Output = 0; //保存输出动作号。
uchar TempH,TempL; //TempH---用来保存整数,TempL---用来保存小数
uint Max,Min;
uint length;
uint Temp1;
uint address1; //原来的外设的最大最小等信息的存储地址
uint address2; //从机的数据存储地址 ;
uint address3; //报警值存储地址。
xdata uchar TempBuff[WsChannelParaLen];
xdata uchar TiJiaoDataBuff[7];
for(j = Channel1 ;j <= Channel8;j++)
{
TempH=(RecvDataBuff[j*7+1]-0x30)*10+(RecvDataBuff[j*7+2]-0x30);//取出2为整数,并且转化为数值。
if(RecvDataBuff[j*7] == 0x2D)//判断数据的符号,若为负。
TempH=TempH|0x80; //将最高位置1,标识该值为负。
TempL=(RecvDataBuff[j*7+4]-0x30)*10+(RecvDataBuff[j*7+5]-0x30); //除掉小数点,取出2位小数位(有3位)。
address1=Ws1channel1 +(wsaddress-1)* 0x100+ j * 0x10;
MyReadBytes(address1,TempBuff,WsChannelParaLen);//读原来的最大,最小值等信息
//通道j的参数 最大值整数,最大值小数,最小值整数,最小值小数,超高报警高,超高报警低,超低报警高,超低报警低,使能,超低报警动作号,超低报警动作号。
// TempBuff[i] 0 1 2 3 4 5 6 7 8 9 10
if(1/*TempBuff[8]*/) //使能位为1,提交数据包
{
TiJiaoDataBuff[0]=StartFlag; //包开始标识
TiJiaoDataBuff[1]=CmdSendSlave; //包标志
TiJiaoDataBuff[2]=SlaveCode; //从机编号
TiJiaoDataBuff[3]=wsaddress; //外设编号
TiJiaoDataBuff[4]=j; //通道编号
TiJiaoDataBuff[5]=TempH; //整数数值
TiJiaoDataBuff[6]=TempL; //小数数值
length=GetMyDataBytes(MyDataLenAdd); //取出当前已保存的数据长度,用来计算下一次的保存地址。
if((length +7) > DataLen7017)
{
address2 = MyDataStart;
MyWriteBytes(address2,TiJiaoDataBuff,LenCmdSendSlave); //以数据包的形式存储到存储器。
MyWriteOneByte(MyDataLenAdd,(DataLen7017%256)); //设置新的数据长度。
MyWriteOneByte(MyDataLenAdd+1,(DataLen7017/256)); //设置新的数据长度。
}
else
{
address2 = MyDataStart + length; //计算保存的地址。
MyWriteBytes(address2,TiJiaoDataBuff,LenCmdSendSlave); //以数据包的形式存储到存储器。
SetMyDataBytes(MyDataLenAdd,LenCmdSendSlave); //设置新的数据长度。
}
//通道j参数 最大值整数,最大值小数,最小值整数,最小值小数,超高报警高,超高报警低,超低报警高,超低报警低,使能,超高报警动作号,超低报警动作号。
//TempBuff[i] 0 1 2 3 4 5 6 7 8 9 10
Temp1=TempH*100+TempL; //比较是否报警
Max=TempBuff[0]*100+TempBuff[1];
Min=TempBuff[2]*100+TempBuff[3];
if(Temp1 >= Max) //如果大于最大值,则超高报警
{
Output = TempBuff[9]; //取出报警号
if(Output != 0xFF)
{
len=MyReadOneByte(WsAlarmLen);
address3=WsAlarm + len;
MyWriteOneByte(address3,Output);
MyWriteOneByte(WsAlarmLen,len + 1);
}
}
else if (Temp1 <= Min)
{
Output = TempBuff[10]; //超低报警
if(Output != 0xFF)
{
len=MyReadOneByte(WsAlarmLen);
address3=WsAlarm + len ;
MyWriteOneByte(address3,Output);
MyWriteOneByte(WsAlarmLen,len + 1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -