⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是一个单片机的项目
💻 C
📖 第 1 页 / 共 3 页
字号:
    while( (k < strlen) && (strlen > 0) )
    {
        SendCharCom(*(str + k));
        k++;
    }
}

/****************************************************************************************
功能:Extern0;产生外部中断0,是仲裁机分配IIC使用权的。
描述:FlagMutex---用于隔离外部中断,假如一次外部中断没有执行完,能响应下一次外部中断;
     FlagExt0---外部中断期间标志;P20---保证IIC使用权已经完全释放才可以再次响应。
参数:无
返回:无
****************************************************************************************/
void Extern0() interrupt 0 using 3
{
   if((FlagExt0 == 0) && (P20 == 1))
   {
      FlagExt0 = 1;
   }
}

/****************************************************************************************
功能:SendEndSignal
描述:发送结束字符
参数:无
返回:无
****************************************************************************************/
void SendEndSignal()
{
   xdata uchar temp[2];
   temp[0]=0x44;
   temp[1]=0x44;
   SendStringCom(temp,2);
}

/****************************************************************************************
功能:ClearMyRom
描述:清零字节数存储地址
参数:无
返回:无
****************************************************************************************/
void ClearMyRam(uint address)
{
    xdata uchar temp[2];
    temp[0]=0x00;
    temp[1]=0x00;
    MyWriteBytes(address,temp,2);
}

/****************************************************************************************
功能:SetDataBytes
描述:设置自带RAM的字节长度
参数:address---存放长度的地址 len---长度值
返回:无
****************************************************************************************/
void SetMyDataBytes(uint address,uchar len)
{
    xdata uchar temp[2];
	uint num;
	MyReadBytes(address,temp,2);
	num = temp[0] + temp[1] * 0x100 + len;     
	temp[0]=num%256;
	temp[1]=num/256;  
    MyWriteBytes(address,temp,2);
}

/****************************************************************************************
功能:GetMyDataBytes
描述:得到自带RAM里的数据字节数
参数:address---存放长度的地址
返回:uint
****************************************************************************************/
uint GetMyDataBytes(uint address)
{	
	xdata uchar temp[2];
    uint num;
	MyReadBytes(address,temp,2);
	num = temp[0] + temp[1] * 0x100;
	return num;
}

/*****************************************************************************************
功能:ClearComRam
描述:清零字节数存储地址
参数:address---需要清零的地址
返回:无
*****************************************************************************************/
void ClearComRam(uint address)
{
    uchar temp[2];
    temp[0]=0x00;
    temp[1]=0x00;
    ComWriteBytes(address,temp,2);
}

/****************************************************************************************
功能:SetComDataBytes;设置字节数的函数
描述:设置公共RAM的字节长度。是先读出长度,再累加一个需要设置的长度。
参数:address---需要设置字节数的地址;len---需要设置的长度。
返回:无
****************************************************************************************/
void SetComDataBytes(uint address,uchar len)
{
	uint num;
	uchar temp[2];
	ComReadBytes(address,temp,2);
	num = temp[0] + temp[1] * 0x100 + len;   
	temp[0]=num%256;
	temp[1]=num/256; 
    ComWriteBytes(address,temp,2);
}

/****************************************************************************************
功能:GetComDataBytes;取到字节数的函数
描述:取得公共RAM里的数据字节数
参数:address---存放字节数的地址
返回:uint
****************************************************************************************/
uint GetComDataBytes(uint address)
{
	uint num;
	uchar temp[2];
	ComReadBytes(address,temp,2);
	num = temp[0] + temp[1] * 256;
	return num;
}

/****************************************************************************************
功能:MainSerialReceive,串口接受,完整的一串命令保存
描述:MainSerialReceive主要负责接收服务器用串口发来的命令数据,并且保存在RecvOrderBuff数组
     中,当达到接收个数时候,设置FlagSaveSerial标志,然后由SaveSerial函数来保存命令,命令
	 主要分为InitState---命令的起始标志状态,CommandState---包标志状态,DataState---数据
	 状态组成;FlagOrderSaved是接收的命令已保存的标志,只有当接收数组的命令已保存才可以再
	 次接收,否则可能冲掉原来的命令。
参数:无
返回:无
****************************************************************************************/
void MainSerialReceive(void) interrupt 4 using 0
{
    uchar ch;
    if(RI)
    {        
        RI = 0;
        ch=SBUF;
       switch (RecvState) 
	   {
         case InitState:  
              if (ch == StartFlag && FlagOrderSaved) // 开始字节
	           {  RecvCount = 0;
                  RecvState=CommandState; // 下一个状态
			      RecvOrderBuff[RecvCount++]=ch; 
               }
               break;

         case CommandState:
              if (!valid_cmd[ch])// 无效命令字节
			  { 
                  RecvState=InitState; 
              } 
		      else 
			  {
                  RecvState=DataState;
                  RecvOrderBuff[RecvCount++]=ch; // 保存命令

                  switch(ch)
                  {
                    case CmdWs :
                         RecvSize=LenCmdWs;
                         break;
					case CmdSlave: 
						 RecvSize=LenCmdSlave;
                         break;
                    case CmdTime:
						 RecvSize=LenCmdTime ;
                         break;
                    case CmdAlarm :
						 RecvSize=LenCmdAlarm;
                         break;
                    case CmdChannelPara:
						 RecvSize=LenCmdChannelPara;
                         break;
					case CmdGetChannelPara:
					     RecvSize=LenCmdGetChannelPara;
					     break;
					case CmdSlaveEnable:
                         RecvSize=LenCmdSlaveEnable;
					     break;
                    case CmdWsControl:
                         RecvSize=LenCmdWsControl;
						 FlagCmdWsControl=1;
                         break;
                    default:
                         break;
				  }
              }
              break;

         case DataState: // 数据包内容
               RecvOrderBuff[RecvCount++]=ch; // 保存数据
                        
               if ((RecvCount)==RecvSize) //数据接收完毕
	           { 					  	   
                   if(!FlagCmdWsControl)  //当不是外设控制包的时候
				   {
                       RecvState=InitState;                  
                       FlagSaveSerial=1;
                  	   FlagOrderSaved = 0;
				   }
				   else
				   {
					   FlagCmdWsControl=0;
                       RecvSize=LenCmdWsControl+RecvOrderBuff[LenCmdWsControl-1];
				   }
               }
               break;
		  default: 
               RecvState=InitState;
               break;
          }
     }
}

/****************************************************************************************
功能:SaveSerial,保存串口接收的一帧数据到自己的内存
描述:当FlagSaveSerial=1的时候,将MainSerialReceive接收到RecvOrderBuff数组的数据保存到相应
     的存储空间中去。
参数:无
返回:无
****************************************************************************************/
void SaveSerial()
{   
	uchar ch;
	uchar i,j,k;
    uint Len;
	uint SaveAddr1;

    ch=RecvOrderBuff[1];

	switch(ch)
	{
	    case CmdTime:  //时间命令包,总是保留最新的数据,无需叠加存储
					   SaveAddr1=MyTimeStart ;
					   MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存 
					   MyWriteOneByte(MyLenTimer,LenCmdTime); //存字节数
					   FlagOrderSaved = 1;  //设置命令已保存的标志,可以再接收命令了。
					   SendEndSignal();     //回送一个$$命令
					   break;
	    case CmdSlaveEnable:  //从机使能包,总是保留最新的数据,无需叠加存储
				 	   SaveAddr1= MySlaveEnable;
                       MyWriteOneByte(MyLenSlaveEnable,LenCmdSlaveEnable);
					   MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存 
					   MyWriteOneByte(MySlaveEnableNewFlag, 0x01); //置位从机使能更新状态表示。
					   FlagOrderSaved = 1;  //设置命令已保存的标志,可以再接收命令了。
					   SendEndSignal();     //回送一个$$命令
          			   break;
	    case CmdGetChannelPara: //获取从机外设基数偏差信息命令
					   Len=GetMyDataBytes(MyLenChannelInfo);
					   if(Len + RecvSize < MaxGetChannelParaLen)
					   {
					      SaveAddr1=MyChannelInfoStart + Len;                         
					      MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存
 						  SetMyDataBytes(MyLenChannelInfo,LenCmdGetChannelPara);
						  FlagOrderSaved = 1;  //设置命令已保存的标志,可以再接收命令了。
						  SendEndSignal();     //回送一个$$命令
					   }
				       break;
		case CmdAlarm: //报警输出包
					   Len=GetMyDataBytes(MyLenOutput);
					   if(Len + RecvSize < MaxAlarmLen)
					   {
					      SaveAddr1=MyOutputStart + Len;
					      MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存 
						  SetMyDataBytes(MyLenOutput,LenCmdAlarm);
						  FlagOrderSaved = 1;  //设置命令已保存的标志,可以再接收命令了。
						  SendEndSignal();     //回送一个$$命令
					   }
				       break;
		case CmdChannelPara: //通道参数包
					   i=RecvOrderBuff[2]; //取得从机编号
					   j=RecvOrderBuff[3]; //取得外设编号
					   k=RecvOrderBuff[4]; //取得通道编号
					   SaveAddr1=Slave1Ws1ChannelInfo + (i-1)*0x500 + (j-1)* 0x100+k*9; //通过从机编号,外设编号,通道编号计算需要保存的地址
					   MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存 
                       SendEndSignal();     //回送一个$$命令
					   FlagOrderSaved = 1;  //设置命令已保存的标志,可以再接收命令了。
				       break;
		default:       //其他数据包
                       Len=GetMyDataBytes(MyLenOrder);
					   if(Len <= (MaxOrderLen -RecvSize))
					   {
					      SaveAddr1=MyOrderStart + Len;
					      MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存 
						  SetMyDataBytes(MyLenOrder,RecvSize);
						  SendEndSignal();
 						  FlagOrderSaved = 1;  //设置命令已保存的标志,可以再接收命令了。
					   }
				       break;
     }	 
     RecvCount=0;         //清楚串口接收计数器
}

/****************************************************************************************
功能:SendChannelPara,发送从机通道基数偏差信息给上位机
描述:主机从自己的MyChannelInfoStart地址区读取通道基数偏差信息,再按从机,外设,通道找到相应的
存储位置,读取9个字节,返回给上位机。
参数:无
返回:无
****************************************************************************************/
void SendChannelPara()
{
   uint address1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -