亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ex3modbus.c

?? 一個基于三星s3c44b0x的串口協議轉換器源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:

/***********************************************************************/	
/*			                        FILE: Ex3ModBus.c                      
/***********************************************************************/
#include  <time.h>
#include  <math.h>
#include  "Ex3.h"
#include  "console.h"
#include  "Ex3Comm.h"
#include  "EX3ModBus.h"

extern 	struct LibS    Lib;
struct     ModS  Mod;

/***********************************************************************/
/* FunName:	FromToModBus								
/* InPut	    :	UartNo								
/* Output    :	void									
/* Function  :	The entry of this function					    	
/* By	    :	zhanghong							     	
/* Time	    :	2006-11-25							     	
/***********************************************************************/
void  FromToModBus(WORD UartNo)
{
	WORD    bytes,totalbytes,Processed,Check;
	time_t    Curtime;
	struct     ModS  *Modp;
	Modp=&Mod;
	//after modbus having setted para
	if(Lib.Isdown==ON)
	{
		if(Lib.SetNodeOk==ON) 	//node ret is ok
		{
			switch(Lib.ModBusCmd)
			{
				case FORCE_SINGLE_COIL:
				case PRESET_SINGLE_REGISTER:
					bytes=OrgModSinRet((BYTE *)&Lib.DownRegAddr, Lib.RcvModBuff);
					break;
				case FORCE_MULTIPLE_COILS:
				case PRESET_MULTIPLE_REGISTERS:
					bytes=OrgModMultiRet((BYTE *)&Lib.DownRegAddr, (BYTE *)&Lib.DownRegCount);
					break;
				default: 	break;
			}
			totalbytes=OrgModPkt(UartNo, bytes);
			delay(5000000);
			Modp->SendBytes=SendUart(UartNo,Modp->ToBuff,totalbytes);
			//clear info in Libs
			Lib.ModBusCmd=0;
			Lib.Isdown=OFF;
			Lib.SetNodeOk=OFF;
			Lib.DownRegAddr=0;
			Lib.DownRegCount=0;
			Lib.ModBusCmd=0;
			Lib.pYcDown=NULL;
			Lib.pYxDown=NULL;
		}
		else
		{
			mytime(&Curtime);
		}
	}

	//receive pkt from modbus
	if(Modp->SyncFull==OFF)FindModSync(UartNo);
	if(Modp->SyncFull==ON&&Modp->HeadFull==OFF)ReadModHead(UartNo);
	if(Modp->HeadFull==ON&&Modp->DataFull==OFF)ReadModData(UartNo);
	if(Modp->DataFull==ON)
	{
		//Check=CheckModPkt(UartNo);
		//if(Check==ON)
			bytes=FromModProc(UartNo);	//process the data has been received
		switch(Processed)
		{
			case ON:
		 		Modp->ErrTimes=0;
				break;
			case -RCV_SET_PKT_OK:
				Lib.WaitNodeSet=ON;
				Modp->ErrTimes=0;
				break;
			case -ERR_SET_SINGLE_COIL:
			case OFF:
				Modp->ErrTimes++;
				break;
			default: 	break;
		}
		ClearModBuff(UartNo);
        	Modp->RecvData=OFF;
	}
	
}

/***********************************************************************/
/* FunName:	FindScadaSync								
/* InPut	    :	UartNo								
/* Output    :	void							
/* Function  :	Find sync bytes from recvuart used for ModBus	    	
/* By	    :	zhanghong						
/* Time	    :	2006-11-25						
/***********************************************************************/
void  FindModSync(WORD UartNo)
{
	WORD    nbytes;
	time_t    CurTime;
	BYTE      sync,i;
	struct     ModS  *Modp;
	Modp=&Mod;
	mytime(&CurTime);
	//printf("findmodsysnc is running\n");
	for (i=0;i<30;i++)
	{
		nbytes=RecvUart(UartNo,&sync,1);
		if (nbytes==0) 
			ReadNoByteFromModBus(UartNo);
		else
		{
			#ifdef DEBUG_MODBUS 
				printf("mod:s=%02x ",sync);
			#endif
			Modp->LastRecvDataTime=CurTime;
                	Modp->RecvData=ON;
			Modp->SearchSyncNum++;
                	if(sync==Modp->SynCode[Modp->RecvSyncNum]&&Modp->RecvSyncNum<Modp->SynBytes)
                        	Modp->RecvSyncNum++;
           		else 
			{
                         	if(Modp->RecvSyncNum==Modp->SynBytes)
				{
                           		HaveFoundModSync();
                                   Modp->FromBuff[Modp->SynBytes+0]=sync;
                                   #ifdef DEBUG_MODBUS 
						printf("ModBus Find...........sync\n");
					#endif
                                   break;          /*exit for loop*/
                             }
                             else 
					SearchModSyncFault();
                        }
		}
	}
}

/***********************************************************************/
/* FunName:	HaveFoundmodSync							
/* InPut	    :	void								
/* Output    :	void								
/* Function  :	Clear states used for sync after sync is full	 	    	
/* By	    :	zhanghong							
/* Time	    :	2006-11-25							
/***********************************************************************/
void  HaveFoundModSync(void)
{
	int     i;
	struct     ModS  *Modp;
	Modp=&Mod;
	Modp->RecvSyncNum=0;
	Modp->SearchSyncNum=0;
	Modp->SyncFull=ON;
	for(i=0;i<Modp->SynBytes;i++)
		Modp->FromBuff[i]=Modp->SynCode[i];
	Modp->RecvByteNum=Modp->SynBytes+1;
}

/***********************************************************************/
/* FunName:	ReadModHead							
/* InPut	    :	UartNo								
/* Output    :	void								
/* Function  :	read head package from the uart used for modbus	    	
/* By	    :	zhanghong							
/* Time	    :	2006-12-5							
/***********************************************************************/
void	ReadModHead(WORD UartNo)
{
	WORD	nbytes,i,HeadBytes;
	BYTE	*p;
	struct     ModS  *Modp;
	Modp=&Mod;
	
	HeadBytes=Modp->HeadBytes;
	if(Modp->RecvByteNum>=HeadBytes)
	{
		Modp->HeadFull=ON;//may HeadBytes is 0
		return;
	}
	nbytes=HeadBytes-(Modp->RecvByteNum-Modp->SynBytes);
	p=&Modp->FromBuff[Modp->RecvByteNum];
	nbytes=uintmin(nbytes,sizeof(Modp->FromBuff)-Modp->RecvByteNum);
	nbytes=RecvUart(UartNo,p,nbytes);
	#ifdef DEBUG_MODBUS 
	{
		printf("Mod:h=");
		for(i=0;i<nbytes;i++)
			printf("%02x",p[i]);
		printf("\n");
	}
	#endif
	if (nbytes==0)
		ReadNoByteFromModBus(UartNo);
	else
	{
		Modp->RecvData=ON;
		mytime(&Modp->LastRecvDataTime);
		Modp->RecvByteNum+=nbytes;
	}
	if(Modp->RecvByteNum>=HeadBytes)
	{
		Modp->HeadFull=ON;
		Modp->Cmd=Modp->FromBuff[Modp->SynBytes];
		switch(Modp->Cmd)
		{
			case READ_OUTPUT_STATUS:
			case READ_INPUT_STATUS:		
			case READ_OUTPUT_REGISTERS:		
			case READ_INPUT_REGISTERS:
			case FORCE_SINGLE_COIL:			
			case PRESET_SINGLE_REGISTER:
				Modp->PktBytes=Modp->SynBytes+Modp->HeadBytes+2;
				break;
				
			case FORCE_MULTIPLE_COILS:		
				Modp->RcvDataBytes=((Modp->FromBuff[Modp->SynBytes+3]<<8|Modp->FromBuff[Modp->SynBytes+4])+7)/8;
				Modp->PktBytes=Modp->SynBytes+Modp->HeadBytes+1+Modp->RcvDataBytes+2;
				break;
				
			case PRESET_MULTIPLE_REGISTERS:	
				Modp->RcvDataBytes=((Modp->FromBuff[Modp->SynBytes+3]<<8|Modp->FromBuff[Modp->SynBytes+4]))*2;
				Modp->PktBytes=Modp->SynBytes+Modp->HeadBytes+1+Modp->RcvDataBytes+2;
				break;
				
			default: break;
		}
	}
	#ifdef DEBUG_MODBUS 
		printf("Modp->HeadFull==ON,Modp->Cmd:%02x,Modp->RcvDataBytes:%02i,Modp->PktBytes:%02i\n",Modp->Cmd,Modp->RcvDataBytes,Modp->PktBytes);
	#endif
}


/***********************************************************************/
/* FunName:	SearchModSyncFault					
/* InPut	    :	void							
/* Output    :	void							     	
/* Function  :	Clear states used for sync after having faulted in	
/*			receiving syn				 		
/* By	    :	zhanghong						 	
/* Time	    :	2006-11-25						 	
/***********************************************************************/
void  SearchModSyncFault(void)
{
	struct     ModS  *Modp;
	Modp=&Mod;
	if(Modp->SearchSyncNum>LIMIT_SEARCH_SYN_NUM)
	{
        	ModiModStat(FAULT);
        	Modp->SearchSyncNum=0;
        	Modp->RecvSyncNum=0;
        }
}

/***********************************************************************/
/* FunName:	ModiModStat						
/* InPut	    :	Stat						
/* Output    :	void							
/* Function  :	Modify the state of modBus				
/* By	    :	zhanghong							     	
/* Time	    :	2006-11-25							     	
/***********************************************************************/
void    ModiModStat(BYTE Stat)
{
	Lib.ModBusStat=Stat;
}

/***********************************************************************/
/* FunName:	ReadModData								
/* InPut	    :	UartNo								
/* Output    :	void									
/* Function  :	Modify the state of modBus						
/* By	    :	zhanghong							     	
/* Time	    :	2006-11-25							     	
/***********************************************************************/
void  ReadModData(WORD UartNo)
{
	WORD nbytes,i;
	BYTE *p;
	struct     ModS  *Modp;
	Modp=&Mod;
	
	nbytes=Modp->PktBytes-Modp->RecvByteNum;
	if (nbytes>sizeof(Modp->FromBuff)) 
	{
		ClearModBuff(UartNo);
		return;
	}
	p=&Modp->FromBuff[Modp->RecvByteNum];
	nbytes=RecvUart(UartNo,p,nbytes);
	if (nbytes==0) 
		ReadNoByteFromModBus(UartNo);
	else
	{
		#ifdef DEBUG_MODBUS 
		{
			printf("Mod:d=");
			for(i=0;i<nbytes;i++)
				printf("%02x",p[i]);
			printf("\n");
		}
		#endif
        	Modp->RecvByteNum+=nbytes;
		Modp->RecvData=ON;
        	mytime(&Modp->LastRecvDataTime);
        	if(Modp->RecvByteNum==Modp->PktBytes)
			Modp->DataFull=ON;
        }
	#ifdef DEBUG_MODBUS 
		if(Modp->DataFull==ON)printf("mod:data full\n");
	#endif
}

/***********************************************************************/
/* FunName:	CheckModPkt								
/* InPut	    :	UartNo							
/* Output    :	CheckRight									
/* Function  :	Check crc of the received data					
/* By	    :	zhanghong							 
/* Time	    :	2006-11-27							 
/***********************************************************************/
WORD  CheckModPkt(WORD UartNo)
{
	WORD CheckSum,CheckRight,nbytes,i,UpUnitNo,Addr;
	WORD	Crc16;
	struct     ModS  *Modp;
	Modp=&Mod;
	
	Addr=Modp->FromBuff[0];
	//UpUnitNo=0;
	//Modp->UpUnitNo=UpUnitNo;
	#ifdef DEBUG_MODBUS 
		printf("~~~~~~~~~~check:");
	#endif
	nbytes=Modp->PktBytes;
	CheckSum=CalModBusCrc16(&Modp->FromBuff[0],nbytes-2);
	Crc16=WordSwap((BYTE *)&CheckSum);	//in pkt,crc_high byte,crc_low byte
	if(Crc16!=*(WORD *)&Modp->FromBuff[nbytes-2])
	{
		CheckRight=OFF;
		Modp->ErrTimes++;
		if(Modp->ErrTimes>LIMIT_MOD_ERR_TIMES)
			Lib.ModBusStat=FAULT;
			Modp->ErrTimes=0;
	}
	else	
		CheckRight=ON;
	#ifdef DEBUG_MODBUS 
		printf("check end,CheckRight=%d,crc is %04x\n",CheckRight,Crc16);
	#endif
	return(CheckRight);
}	

/***********************************************************************/
/* FunName:	FromModProc								
/* InPut	    :	UartNo						
/* Output    :	Processed									
/* Function  :	Process the data has been received		     	    	
/* By	    :	zhanghong							 
/* Time	    :	2006-11-25							 
/***********************************************************************/
WORD FromModProc(WORD UartNo)
{
	WORD  bytes,totalbytes,RegAddr,RegCount,count,Processed=OFF;
	BYTE    yxstate;
	struct     ModS  *Modp;
	Modp=&Mod;
	
	Lib.ModBusStat=NORMAL;
	Lib.ModBusCmd=Modp->Cmd;
	RegAddr=Modp->FromBuff[Modp->SynBytes+1]<<8|Modp->FromBuff[Modp->SynBytes+2];
	#ifdef DEBUG_MODBUS 
		printf("Modp->RegAddr:0x%04x\n",RegAddr);
	#endif
	switch(Modp->Cmd)
	{
		case READ_OUTPUT_STATUS:
		case READ_INPUT_STATUS:
			RegCount=Modp->FromBuff[Modp->SynBytes+3]<<8|Modp->FromBuff[Modp->SynBytes+4];
			#ifdef DEBUG_MODBUS 
				printf("Modp->RegCount:0x%04x\n",RegCount);
			#endif
			if(RegAddr>=Lib.TotalYxNum) 
				bytes=OrgModBusYx(RegAddr,0);
			else if(RegAddr+RegCount>Lib.TotalYxNum)
				{
					#ifdef DEBUG_MODBUS 
						printf("waring:RegAddr+RegCount>Lib.TotalYxNum!\n");
					#endif
					count=Lib.TotalYxNum-RegAddr;
					bytes=OrgModBusYx(RegAddr,count);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久成人麻豆午夜电影| 亚洲精品一区二区三区影院 | 久久成人18免费观看| 亚洲一二三区不卡| 欧美日韩国产天堂| 蜜臀av性久久久久蜜臀aⅴ| 欧美成人精品福利| 成人午夜免费电影| 玉足女爽爽91| 欧美一区二区视频在线观看 | 久久久一区二区三区| 国产成人av一区二区| 一区二区三区不卡视频在线观看| 国产精品污www在线观看| 激情成人午夜视频| 亚洲精品菠萝久久久久久久| 亚洲免费伊人电影| 精品国产乱码久久久久久久久| 日韩欧美一级特黄在线播放| 99久久国产综合精品色伊 | 日韩专区中文字幕一区二区| 国产欧美日韩精品a在线观看| 欧美日韩www| 日韩欧美在线网站| 91成人国产精品| 韩国欧美国产一区| 不卡欧美aaaaa| 国产在线不卡一卡二卡三卡四卡| 亚洲国产成人av| 美女视频一区在线观看| 国产成人一级电影| 色狠狠av一区二区三区| 日韩欧美自拍偷拍| 国产精品成人一区二区三区夜夜夜| 精品乱人伦小说| 国产精品传媒入口麻豆| 日韩成人免费看| 亚洲一区二区在线免费观看视频| 国产精品天干天干在线综合| 午夜精品成人在线| 日日夜夜精品视频天天综合网| 国产在线一区二区综合免费视频| 北岛玲一区二区三区四区| 国产福利不卡视频| 欧美日韩国产精品自在自线| 久久久99精品免费观看| 国产色产综合产在线视频| 曰韩精品一区二区| 国产成人丝袜美腿| 91麻豆精品国产| 91精品国产一区二区三区| 中文字幕一区日韩精品欧美| 亚洲丝袜自拍清纯另类| 亚洲黄色尤物视频| 丰满亚洲少妇av| 91日韩一区二区三区| 在线精品国精品国产尤物884a| 不卡在线观看av| 久久综合九色综合久久久精品综合 | 26uuu久久综合| 日日摸夜夜添夜夜添国产精品| 91论坛在线播放| 欧美国产亚洲另类动漫| 国产精品不卡一区| 国产福利视频一区二区三区| 日韩欧美在线不卡| 136国产福利精品导航| 国产91精品在线观看| 精品第一国产综合精品aⅴ| 天天爽夜夜爽夜夜爽精品视频| 91热门视频在线观看| 中文av一区特黄| 成人高清免费在线播放| 中文子幕无线码一区tr| 成人激情免费视频| 国产色综合一区| 成人黄色在线视频| 综合久久久久久久| 91在线免费看| 亚洲制服丝袜av| 欧美巨大另类极品videosbest| 精品理论电影在线| 久久99热国产| 国产日韩欧美不卡在线| 国产成人激情av| 国产精品青草久久| 91美女片黄在线| 亚洲电影你懂得| 粉嫩在线一区二区三区视频| 日本一区二区三级电影在线观看| 成人国产一区二区三区精品| 国产精品久久久久久久久果冻传媒| 国产69精品一区二区亚洲孕妇| 国产女人aaa级久久久级| 成人国产精品免费网站| 亚洲欧美二区三区| 欧美精选一区二区| 国产在线观看一区二区| ...xxx性欧美| 欧美电影在线免费观看| 国产一区欧美一区| 亚洲男同性恋视频| 日韩欧美亚洲另类制服综合在线| 国产精品一区二区在线看| 欧美狂野另类xxxxoooo| 久久国产剧场电影| 亚洲三级在线播放| 欧美一区二区三区在线看| 国产91精品露脸国语对白| 亚洲精品国产a久久久久久| 7777精品伊人久久久大香线蕉经典版下载 | 7777精品伊人久久久大香线蕉| 精品亚洲porn| 精品精品国产高清a毛片牛牛| 国产精品69毛片高清亚洲| 亚洲综合一区在线| 亚洲精品一区二区三区99| 色综合天天做天天爱| 久久综合久久综合亚洲| 一本到一区二区三区| 亚洲另类在线制服丝袜| 日韩精品一区二区三区蜜臀| 99视频精品免费视频| 久草这里只有精品视频| 亚洲一区二区三区四区五区黄| 精品日韩一区二区三区 | 伊人一区二区三区| 精品福利av导航| 欧美嫩在线观看| 色综合天天性综合| 国产精品996| 免费观看30秒视频久久| 日韩欧美国产成人一区二区| 91免费国产在线| 国产乱子伦视频一区二区三区 | 亚洲天堂免费在线观看视频| 日韩欧美一区在线| 欧美三级乱人伦电影| 午夜精品久久一牛影视| 国产精品毛片a∨一区二区三区| 欧美一区二区三区的| 91在线丨porny丨国产| 国产精品一区二区果冻传媒| 另类综合日韩欧美亚洲| 日韩成人免费电影| 日韩影院免费视频| 亚洲资源在线观看| 亚洲精品日韩综合观看成人91| 国产午夜精品理论片a级大结局| 欧美一区国产二区| 884aa四虎影成人精品一区| 欧美日韩在线三区| 欧美日韩免费电影| 欧美日韩不卡一区| 日韩一区二区免费在线观看| 欧美高清激情brazzers| 欧美欧美午夜aⅴ在线观看| 欧美日韩中文另类| 欧美高清dvd| 欧美一区二区三区人| 91精品婷婷国产综合久久竹菊| 91精品国产乱码| 日韩女同互慰一区二区| 精品国产免费视频| 欧美激情一区二区三区全黄| 欧美国产视频在线| 一区二区三区日韩| 五月天精品一区二区三区| 日本免费新一区视频| 国产综合一区二区| 不卡av免费在线观看| 色狠狠桃花综合| 6080日韩午夜伦伦午夜伦| 精品福利一区二区三区免费视频| 国产午夜精品美女毛片视频| 亚洲欧美日韩国产中文在线| 亚洲国产视频a| 国内精品免费**视频| 成+人+亚洲+综合天堂| 欧美年轻男男videosbes| 2023国产精华国产精品| 亚洲女人的天堂| 强制捆绑调教一区二区| 国产成都精品91一区二区三| 91浏览器在线视频| 日韩欧美一区二区视频| 综合中文字幕亚洲| 日韩电影在线看| 99国产精品久久久久久久久久久| 欧美片网站yy| 成人欧美一区二区三区黑人麻豆 | 成人综合日日夜夜| 欧美日韩和欧美的一区二区| 精品国产一区二区三区四区四| 亚洲日本韩国一区| 精品一区二区三区在线观看国产| 91原创在线视频| 欧美电影在哪看比较好| 中文字幕免费不卡| 久久丁香综合五月国产三级网站|