📄 main.c
字号:
uint address2;
uint length;
xdata uchar array[5];
xdata uchar array2[9];
length=GetMyDataBytes(MyLenChannelInfo);
if(length > 0)
{
address1=MyChannelInfoStart;
while(address1< (MyChannelInfoStart + length))
{
MyReadBytes(address1,array,LenCmdGetChannelPara);
if((array[0] == 0x2A) && (array[1] == 0xA7) )
{
address2 = Slave1Ws1ChannelInfo + (array[2]-1)*0x500 + (array[3]-1)* 0x100+ array[4]*9 ;
MyReadBytes(address2,array2,LenCmdChannelPara);
SendStringCom(array2,LenCmdChannelPara);
}
address1 +=LenCmdGetChannelPara;
}
}
ClearMyRam(MyLenChannelInfo);
}
/****************************************************************************************
功能:SendSlaveData,把从机采集的数据通过串口发到服务器
描述:实现把从机采集的数据通过串口发到服务器,
参数:AddStart---数据存储的起始地址,AddLen---数据长度的保存地址
返回:无
****************************************************************************************/
void SendSlaveData(uint AddStart,uint AddLen)
{
uint Len,address;
uchar len1,len2,i;
Len=GetMyDataBytes(AddLen); //先取得需要发送的字节长度。
len1=(uchar)(Len / NUM1); //取得需要拷贝NUM1长度数据的次数
len2=(uchar)(Len % NUM1); //取得不足NUM1长度的剩下数据长度
address=AddStart;
if(Len>0) //验证Len的有效性
{
if(Len>NUM1) //要拷贝的数据长度大于NUM1
{
for(i=0;i<len1;i++)
{
MyReadBytes(address,SendSlaveDataBuff,NUM1);
SendStringCom(SendSlaveDataBuff,NUM1);
address += NUM1;
}
MyReadBytes(address,SendSlaveDataBuff,len2);
SendStringCom(SendSlaveDataBuff,len2);
}
else //要拷贝的数据长度小于NUM1
{
MyReadBytes(address,SendSlaveDataBuff,Len);
SendStringCom(SendSlaveDataBuff,Len);
}
ClearMyRam(AddLen); //发送完毕之后,清楚字节长度
}
}
/****************************************************************************************
功能:CopyToComRam,把自带RAM保存的命令通过缓冲区CopyOrderBuff拷贝到公共RAM区域里面.
描述:实现把自带RAM保存的命令通过缓冲区CopyOrderBuff拷贝到公共RAM区域里面,CopyOrderBuff的
长度是NUM1,分为要拷贝的数据长度大于和小于NUM1两种情况来处理。
参数:address1--自带RAM命令起始地址 address2--公共RAM命令起始地址 lenght--命令字节长度
返回:无
****************************************************************************************/
void CopyToComRam(uint address1,uint address2,uint length)
{
uchar i,len1,len2;
len1 = (uchar)(length/ NUM1); //取得需要拷贝NUM1长度数据的次数
len2 = (uchar)(length % NUM1); //取得不足NUM1长度的剩下数据长度
if(length>0) //验证length的有效性
{
if(length>NUM1) //要拷贝的数据长度大于NUM1
{
for(i=0;i<len1;i++)
{
MyReadBytes(address1,CopyToComRamBuff,NUM1); //先读address1开始的NUM1个数据到CopyBuff里面
ComWriteBytes(address2,CopyToComRamBuff,NUM1); //先把CopyBuff里面NUM1个数据写入address2开始的地址
address1 += NUM1 ;
address2 += NUM1 ;
}
MyReadBytes(address1,CopyToComRamBuff,len2);
ComWriteBytes(address2,CopyToComRamBuff,len2);
}
else //要拷贝的数据长度小于NUM1
{
MyReadBytes(address1,CopyToComRamBuff,length); //先读address1开始的length个数据到CopyBuff里面
ComWriteBytes(address2,CopyToComRamBuff,length); //先把CopyBuff里面length个数据写入address2开始的地址
}
}
}
/****************************************************************************************
功能:CopyToComRam,把公共RAM保存的数据通过CopyOrderBuff拷贝到自带RAM区域里面.
描述:实现把公共RAM保存的数据通过CopyOrderBuff拷贝到自带RAM区域里面,CopyOrderBuff的长度是
NUM1,分为要拷贝的数据长度大于和小于NUM1两种情况来处理。
参数:address1--自带RAM命令起始地址 address2--公共RAM命令起始地址 lenght--命令字节长度
返回:无
****************************************************************************************/
void CopyToMyRam(uint address1,uint address2,uint length)
{
uchar i,len1,len2;
len1=(uchar)(length / NUM1); //取得需要拷贝NUM1长度数据的次数
len2=(uchar)(length % NUM1); //取得不足NUM1长度的剩下数据长度
if(length > 0) //验证length的有效性
{
if(length > NUM1) //要拷贝的数据长度大于NUM1
{
for(i=0; i<len1; i++)
{
ComReadBytes(address1,CopyToMyRamBuff,NUM1); //先读address1开始的NUM1个数据到CopyBuff里面
MyWriteBytes(address2,CopyToMyRamBuff,NUM1); //先把CopyBuff里面NUM1个数据写入address2开始的地址
address1 += NUM1 ;
address2 += NUM1 ;
}
ComReadBytes(address1,CopyToMyRamBuff,len2);
MyWriteBytes(address2,CopyToMyRamBuff,len2);
}
else //要拷贝的数据长度小于NUM1
{
ComReadBytes(address1,CopyToMyRamBuff,length); //先读address1开始的length个数据到CopyBuff里面
MyWriteBytes(address2,CopyToMyRamBuff,length); //先把CopyBuff里面length个数据写入address2开始的地址
}
}
}
/****************************************************************************************
功能:CopyAllToComRam,拷贝所有服务器发来的命令到公共RAM区。
描述:拷贝所有服务器发来的命令到公共RAM区,包括命令数据包,时间数据包和输出相关数据包。
参数:无
返回:无
****************************************************************************************/
void CopyAllToComRam()
{
uint length = 0;
uchar len = 0;
length=GetMyDataBytes(MyLenOrder); //再取得需要写入的字节长度
if((length > 0) && (length <= MaxOrderLen))
{
ClearComRam(ComLenOrder); //先清除公共RAM区命令长度
CopyToComRam(MyLenOrder,ComLenOrder,2); //再把字节长度写入公共RAM区命令长度地址中去
CopyToComRam(MyOrderStart,ComOrderStart,length); //拷贝数据到公共RAM区相应地址中
}
ClearMyRam(MyLenOrder); //清除自带RAM区的字节长度
len = MyReadOneByte(MyLenSlaveEnable);
if(len == 0x07)
{
CopyToComRam(MySlaveEnable,ComSlaveEnable,LenCmdSlaveEnable);//拷贝数据到公共RAM区相应地址中
ComWriteOneByte(ComLenSlaveEnable,LenCmdSlaveEnable); //再把字节长度写入公共RAM区命令长度地址中去
ComWriteOneByte(ComSlaveEnableNewFlag,1);
MyWriteOneByte(MyLenSlaveEnable,0);
}
}
/****************************************************************************************
功能:CopyAllToMyRam,拷贝公共RAM数据到自带RAM区中。
描述:从公共RAM区把从机1,从机2,从机3,从机4,从机5采集的数据拷贝到自带RAM中,等待通过串口
发送给服务器。
参数:无
返回:无
****************************************************************************************/
void CopyAllToMyRam()
{
uint length = 0;
length = GetComDataBytes(ComSlaveLenAdd1); //再取得需要写入从机1的字节长度
if((length > 0) && (length <= MaxSlaveDataLen))
{
ClearMyRam(MySlaveLenAdd1); //先清除从机1的数据长度
CopyToMyRam(ComSlaveLenAdd1,MySlaveLenAdd1,2); //再把从机1字节长度写入自带RAM区命令长度地址中去
CopyToMyRam(ComSlaveDataStart1,MySlaveDataStart1,length); //从公共RAM拷贝从机数据到自带RAM区相应地址中
}
ClearComRam(ComSlaveLenAdd1); //清除公共RAM区的字节长度
length = 0;
length=GetComDataBytes(ComSlaveLenAdd2); //再取得需要写入从机2的字节长度
if((length > 0) && (length <= MaxSlaveDataLen))
{
ClearMyRam(MySlaveLenAdd2); //先清除从机2的数据长度
CopyToMyRam(ComSlaveLenAdd2,MySlaveLenAdd2,2); //再把从机1字节长度写入自带RAM区命令长度地址中去
CopyToMyRam(ComSlaveDataStart2,MySlaveDataStart2,length); //从公共RAM拷贝从机数据到自带RAM区相应地址中
}
ClearComRam(ComSlaveLenAdd2); //清除公共RAM区的字节长度
length = 0;
length=GetComDataBytes(ComSlaveLenAdd3); //再取得需要写入从机3的字节长度
if((length > 0) && (length <= MaxSlaveDataLen))
{
ClearMyRam(MySlaveLenAdd3); //先清除从机3的数据长度
CopyToMyRam(ComSlaveLenAdd3,MySlaveLenAdd3,2); //再把从机1字节长度写入自带RAM区命令长度地址中去
CopyToMyRam(ComSlaveDataStart3,MySlaveDataStart3,length); //从公共RAM拷贝从机数据到自带RAM区相应地址中
}
ClearComRam(ComSlaveLenAdd3); //清除公共RAM区的字节长度
length = 0;
length=GetComDataBytes(ComSlaveLenAdd4); //再取得需要写入从机4的字节长度
if((length > 0) && (length <= MaxSlaveDataLen))
{
ClearMyRam(MySlaveLenAdd4); //先清除从机4的数据长度
CopyToMyRam(ComSlaveLenAdd4,MySlaveLenAdd4,2); //再把从机1字节长度写入自带RAM区命令长度地址中去
CopyToMyRam(ComSlaveDataStart4,MySlaveDataStart4,length); //从公共RAM拷贝从机数据到自带RAM区相应地址中
}
ClearComRam(ComSlaveLenAdd4); //清除公共RAM区的字节长度
length = 0;
length=GetComDataBytes(ComSlaveLenAdd5); //再取得需要写入从机5的字节长度
if((length > 0) && (length <= MaxSlaveDataLen))
{
ClearMyRam(MySlaveLenAdd5); //先清除从机5的数据长度
CopyToMyRam(ComSlaveLenAdd5,MySlaveLenAdd5,2); //再把从机1字节长度写入自带RAM区命令长度地址中去
CopyToMyRam(ComSlaveDataStart5,MySlaveDataStart5,length); //从公共RAM拷贝从机数据到自带RAM区相应地址中
}
ClearComRam(ComSlaveLenAdd5); //清除公共RAM区的字节长度
}
void main()
{
uchar i=0;
uint length = 0;
uchar xdata array[7];
/****************************************主机默认初始化参数*****************************************/
InitSerialComm(); //串口初始化。
Time0Initial(); //定时器0初始化。
SCONF |= 0x02; //使用xdata的使能控制。
P20 = 1;
/****************************************主机自带RAM初始化*****************************************/
ClearMyRam(MyLenOrder);
ClearMyRam(MyLenOutput);
ClearMyRam(MyLenTimer);
ClearMyRam(MySlaveLenAdd1);
ClearMyRam(MySlaveLenAdd2);
ClearMyRam(MySlaveLenAdd3);
ClearMyRam(MySlaveLenAdd4);
ClearMyRam(MySlaveLenAdd5);
ClearMyRam(MyLenChannelInfo);
ClearMyRam(MyLenSlaveEnable);
/****************************************主机自带RAM初始化*****************************************/
for(i=0;i<7;i++)
{
RecvOrderBuff[i]=0; //初始化外设命令接收数组。
}
for(i=0;i<NUM1;i++)
{
CopyToComRamBuff[i] = 0; //初始化外设命令接收数组。
CopyToMyRamBuff[i] = 0;
SendSlaveDataBuff[i] = 0;
}
while(1)
{
for(i=0;i<7;i++)
{
array[i]=0; //初始化外设命令接收数组。
}
if(FlagSaveSerial) //命令已接收标识。
{
FlagSaveSerial=0; //复位命令已接收标识。
SaveSerial(); //保存命令。
}
if(FlagExt0) //如果有I2C使用权。
{
CopyAllToMyRam(); //拷贝所有数据到自带RAM。
CopyAllToComRam(); //拷贝所有数据到公共RAM。
FlagSendSlaveData = 1;
FlagExt0=0; //外部中断0标志位复位.
P20 = 0; //释放IIC使用权。
Delay(DelayTime);
P20 = 1;
P0 = 0xFF; //設置P0口高阻抗。
SendCharCom(0x99);
}
if(FlagSendSlaveData)
{
SendSlaveData(MySlaveDataStart1,MySlaveLenAdd1);//发送从机数据到服务器。
SendSlaveData(MySlaveDataStart2,MySlaveLenAdd2);//发送从机数据到服务器。
SendSlaveData(MySlaveDataStart3,MySlaveLenAdd3);//发送从机数据到服务器。
SendSlaveData(MySlaveDataStart4,MySlaveLenAdd4);//发送从机数据到服务器。
SendSlaveData(MySlaveDataStart5,MySlaveLenAdd5);//发送从机数据到服务器。
FlagSendSlaveData =0;
}
if(FlagTime0)
{
SendChannelPara();
FlagTime0=0; //复位定时器0中断标识置位。
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -