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

📄 rs232.c

📁 一整套电梯控制器源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			} 
			
			sbuf_rec=INVALID_ASC2;
		}else if((sbuf_rec==END_0x0A)){							//最后1个命令元素0x0A
			if(m_host_flg==0){
				m_scc.m_ReadBuf[m_scc.nReadCount]=sbuf_rec;
				m_scc.nReadCount++;
				SBUF=sbuf_rec;		//返回接收的数据
			}else{
			}

			sbuf_rec=INVALID_ASC2;
			//完整命令解析
			if(m_host_flg==0){
				//(串口在主程序及中断中)
				m_resolve_flg=1;
				//(串口仅在主程序中)
//				command(m_scc.m_ReadBuf/*, m_scc.nReadCount*/);
			}else{
			}
		}else if(sbuf_rec!=INVALID_ASC2){							//第3,......个命令元素,放入数组相应位置
			
			if(m_host_flg==0){
				m_scc.nReadCount++;
				m_scc.m_ReadBuf[m_scc.nReadCount-1]=sbuf_rec;
				SBUF=sbuf_rec;		//返回接收的数据
			}else{
			}
			
			sbuf_rec=INVALID_ASC2;
		}

	}

}

//收完完整命令后,解析命令
void command(uchar *pBuf)
{
	uchar xdata i,j; 
	uchar xdata cParamNum;		//监视参数个数
	uchar xdata *add_setparam;
	uchar xdata type_setparam;
	j=0;

	switch(pBuf[1]){
		case 'V':	//通讯解除
			m_msg_quit_flg=1;						//置通讯解除标记
			message_quit();
		break;
		case 'M':	//参数监视
			if(m_msg_monitor_flg==0){
				m_msg_monitor_flg=1;				//置监视标记
				m_monitor_delay_count=0;			
//				m_monitor_delay_flg=1;				//置监视延迟标志
			}
			cParamNum=__tofig(pBuf[2]);
			for(i=0; i<cParamNum; i++){
				m_monitor_ad[m_add_type_idx]=GetValidAdd(pBuf+3+j);
				m_monitor_type[m_add_type_idx]=__tofig(pBuf[7+j]);
				m_add_type_idx++;
				j=j+5;
			}

		break;
		case 'E':	//参数设定
			m_msg_set_flg=1;							//置参数设定标记
			add_setparam=GetValidAdd(pBuf+2);			//取得设置参数地址
			type_setparam=__tofig(*(pBuf+6));			//取得设置参数类型
			SetParamVal(pBuf+7,add_setparam,type_setparam);
			if((add_setparam>=0x1004)&&(add_setparam<=0x1010)){	//置年月日时分秒标记
				m_set_time=1;
			}
		break;
		default:	//联机测试
		break;
	}		 

	m_resolve_flg=0;
}

void monitor_send(void)
{
  uchar sendbuf;
  if(m_comm_enable_flg==1){

		//监视参数状态
		if(m_msg_monitor_flg==1){		//监视中
			//置host标记
			m_host_flg=1;
			
			//作成及发送监视数据
			if((m_monitor_delay_count>=SCC_MONITOR_DELAYCOUNT)){	

//(串口仅在主程序中)
				//作成发送缓冲区
/*				if(m_scc.WriteFlg==0){							//完整命令起始
					if(m_monitor_type[m_active_idx]!=0){		//有效的类型
						make_send_buf();							//做成发送数据
					}else{		//遇无效类型,尝试监视下一参数
						m_active_idx++;
						if(m_active_idx>=MORN_PARAM_NUM)
							m_active_idx=0;
						return;						
					}
				}*/

				//发送
				if((m_scc.WriteFlg==1) && (m_get_senddata_flg==1)){
					sendbuf=m_scc.m_WriteBuf[m_scc.nWriteCount];
					SBUF=sendbuf;
					m_get_senddata_flg=0;
					m_scc.nWriteCount++;
					
					if(m_scc.nWriteCount>=m_scc.dwWriteReqSize){	//完整命令发送完					
						m_scc.nWriteCount=0;
						m_scc.WriteFlg=0;
						m_active_idx++;

						if(m_active_idx>=MORN_PARAM_NUM)
							m_active_idx=0;
					}
				}

			}	
		}
	}
}

//-------------------------------------------------------------------------------------------------------------------------------

void message_quit(void)                              //V 命令子程序
{     
	   uchar xdata i;
	   for(i=0; i<5; i++){
	   	  m_monitor_type[i]=0;                       // 监视参数标志清零
	   }

		m_msg_monitor_flg=0;				// 监视命令标记
//		m_monitor_delay_flg=0;			// 监视延迟标记
		m_monitor_delay_count=0;		
		m_msg_quit_flg=0; 				// 解除监视命令标志
		m_msg_set_flg=0;					// 参数设定命令标记
		m_get_senddata_flg=1;
		m_scc.nWriteCount=0;
		m_add_type_idx=0;
		m_active_idx=0;
      sbuf_rec=INVALID_ASC2;
		m_scc.WriteFlg=0;
}

void make_send_buf(void)
{
	uchar xdata *sss_char;
	uint  xdata *sss_int;
	ulong xdata *sss_long;
	signed char scVal=0;
	uchar ucVal=0;
	uint  unVal=0;
    ulong ulVal=0;  
	sss_char=m_monitor_ad[m_active_idx];
	sss_int=m_monitor_ad[m_active_idx];
	sss_long=m_monitor_ad[m_active_idx];

	m_scc.m_WriteBuf[0]=SEND_COMMAND;
	m_scc.m_WriteBuf[1]='M';
	m_scc.m_WriteBuf[2]=__toascii((m_monitor_ad[m_active_idx]>>12)&0x0F);
	m_scc.m_WriteBuf[3]=__toascii((m_monitor_ad[m_active_idx]>>8)&0x0F);
	m_scc.m_WriteBuf[4]=__toascii((m_monitor_ad[m_active_idx]>>4)&0x0F);
	m_scc.m_WriteBuf[5]=__toascii((m_monitor_ad[m_active_idx])&0x0F);
	m_scc.m_WriteBuf[6]=__toascii((m_monitor_type[m_active_idx])&0x0F);
	if(m_monitor_type[m_active_idx]==1){
		ucVal=(uchar)*sss_char;
		m_scc.m_WriteBuf[7]=__toascii((ucVal>>4)&0x0F);
		m_scc.m_WriteBuf[8]=__toascii((ucVal)&0x0F);
		m_scc.m_WriteBuf[9]=END_0x0D/*__toascii(END_0x0D)*/;
		m_scc.m_WriteBuf[10]=END_0x0A/*__toascii(END_0x0A)*/;
		m_scc.dwWriteReqSize=11;
	}else if(m_monitor_type[m_active_idx]==2){
		unVal=(uint)*sss_int;
		m_scc.m_WriteBuf[7]=__toascii((unVal>>12)&0x0F);
		m_scc.m_WriteBuf[8]=__toascii((unVal>>8)&0x0F);
		m_scc.m_WriteBuf[9]=__toascii((unVal>>4)&0x0F);
		m_scc.m_WriteBuf[10]=__toascii((unVal)&0x0F);
		m_scc.m_WriteBuf[11]=END_0x0D/*__toascii(END_0x0D)*/;
		m_scc.m_WriteBuf[12]=END_0x0A/*__toascii(END_0x0A)*/;
		m_scc.dwWriteReqSize=13;
	}else if(m_monitor_type[m_active_idx]==3){
		ulVal=(ulong)*sss_long;
		m_scc.m_WriteBuf[7]=__toascii((ulVal>>28)&0x0F);
		m_scc.m_WriteBuf[8]=__toascii((ulVal>>24)&0x0F);
		m_scc.m_WriteBuf[9]=__toascii((ulVal>>20)&0x0F);
		m_scc.m_WriteBuf[10]=__toascii((ulVal>>16)&0x0F);
		m_scc.m_WriteBuf[11]=__toascii((ulVal>>12)&0x0F);
		m_scc.m_WriteBuf[12]=__toascii((ulVal>>8)&0x0F);
		m_scc.m_WriteBuf[13]=__toascii((ulVal>>4)&0x0F);
		m_scc.m_WriteBuf[14]=__toascii((ulVal)&0x0F);
		m_scc.m_WriteBuf[15]=END_0x0D/*__toascii(END_0x0D)*/;
		m_scc.m_WriteBuf[16]=END_0x0A/*__toascii(END_0x0A)*/;
		m_scc.dwWriteReqSize=17;
	}

	m_scc.WriteFlg=1;
	m_scc.nWriteCount=0;
	
}

// 转换为ASCII
uchar __toascii(uchar c)
{
	uchar ret;
	if(c>9)
		ret=0x37+c; 
	else
		ret=0x30+c;
	return ret;
}

// ASCII转换为数字
uchar __tofig(uchar cAscii)
{
	uchar ret;
	if((cAscii>=0x30) && (cAscii<=0x39))
		ret=cAscii-0x30;
	else if((cAscii>=0x41) && (cAscii<=0x46))
		ret=cAscii-0x37;

	return 	ret;
}

//
uint GetValidAdd(uchar *pBuf)
{	
	uint nValidAdd=0;
	xdata uchar c1,c2,c3,c4;

	if(pBuf[0]>'9')
		c1=pBuf[0]-0x37;
	else
		c1=pBuf[0]-0x30; 
	if(pBuf[1]>'9')
		c2=pBuf[1]-0x37;
	else
		c2=pBuf[1]-0x30; 
	if(pBuf[2]>'9')
		c3=pBuf[2]-0x37;
	else
		c3=pBuf[2]-0x30; 
	if(pBuf[3]>'9')
		c4=pBuf[3]-0x37;
	else
		c4=pBuf[3]-0x30; 

	nValidAdd = (c1<<12)|(c2<<8)|(c3<<4)|(c4);
	return nValidAdd;
}

//设定参数值
//parameter: pSrcBuf--源数字
void SetParamVal(uchar *pSrcBuf, uchar *pDestBuf, uchar type)
{	
	xdata uchar val;
//	xdata uchar i;

	signed char scVal=0;
	uchar ucVal=0;
	uint  unVal=0;
   ulong ulVal=0; 


	switch(type){
		case 0: 

		break;
		case 1: 
			val=__tofig(pSrcBuf[0]);	//高4位
			pDestBuf[0]=(val<<4)&0xF0;
			val=__tofig(pSrcBuf[1]);	//低4位
			pDestBuf[0]=pDestBuf[0]|(val&0x0F);
		break;
		case 2: 
			val=__tofig(pSrcBuf[0]);	//高4位
			pDestBuf[0]=(val<<4)&0xF0;
			val=__tofig(pSrcBuf[1]);	//低4位
			pDestBuf[0]=pDestBuf[0]|(val&0x0F);
			val=__tofig(pSrcBuf[2]);	//高4位
			pDestBuf[1]=(val<<4)&0xF0;
			val=__tofig(pSrcBuf[3]);	//低4位
			pDestBuf[1]=pDestBuf[1]|(val&0x0F);
		break;
		case 3: 
			val=__tofig(pSrcBuf[0]);	//高4位
			pDestBuf[0]=(val<<4)&0xF0;
			val=__tofig(pSrcBuf[1]);	//低4位
			pDestBuf[0]=pDestBuf[0]|(val&0x0F);
			val=__tofig(pSrcBuf[2]);	//高4位
			pDestBuf[1]=(val<<4)&0xF0;
			val=__tofig(pSrcBuf[3]);	//低4位
			pDestBuf[1]=pDestBuf[1]|(val&0x0F);
			val=__tofig(pSrcBuf[4]);	//高4位
			pDestBuf[2]=(val<<4)&0xF0;
			val=__tofig(pSrcBuf[5]);	//低4位
			pDestBuf[2]=pDestBuf[2]|(val&0x0F);
			val=__tofig(pSrcBuf[6]);	//高4位
			pDestBuf[3]=(val<<4)&0xF0;
			val=__tofig(pSrcBuf[7]);	//低4位
			pDestBuf[3]=pDestBuf[3]|(val&0x0F);
		break;
		default: 
		break;
	}
	


}

⌨️ 快捷键说明

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