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

📄 pollute.c

📁 一个关于MODBUS方面的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************
* FileName : pollute.c  
* Author   : Jack Zhang
* Date     : 06/6/2008   
*********************************************************************/
#include <psos.h>
#include <custom_defs.h>
#include <tmInterrupts.h>
#include <AppModel.h>
#include <stdio.h>
#include <string.h>
#include <tmNxTypes.h>
#include <tmDbg.h>
#include <tmosal.h>
#include <dprintf.h>
#include <tmbslCore.h>
#include <tmosal.h>
#include "modbus.h"
#include "pollute.h"
#include "uart_local.h"
#include "uart.h"

#define  VALID_DEBUG


unsigned char **valid_pack;//二级指针用来指向分包

int packs_num;
int valid_len;
valid_head *valid =NULL;
valid_cp *cpvalid =NULL;
valid_head **pvalid =NULL;
valid_cp **pcpvalid =NULL;
//---------------公有函数----------------------------------------
extern  unsigned short crc16(unsigned char *, unsigned short); //CRC校验
int packnum_check(unsigned char * ,uint16 len);  //包的数量
void bale_split(unsigned char*,uint16,int); //拆分包
char * hex2dec(const char *);
//---------------------------------------------------------------

//----------------------计算包数量------------------------------------

int packnum_check(unsigned char * packs,uint16 len)  
{ 
   int i;
   
   int count;

   for(i =0; i<len; i++)
     {
     	if((0x23 ==atoi(packs[i]))&&(0x23 ==atoi(packs[i+1])))
     	
     	  count++;
     	 
    
     }

#ifdef VALID_DEBUG

      printf("count =%d\n",count);
      
#endif

   return count;
}
//----------------------拆分包-----------------------------------------
void bale_split(unsigned char* bale,uint16 num,int length)  //ASCII和RTU的包拆分法也不一样,区别在从几开始拆
{     
   int i=0,j=0,k=0;

#ifdef VALID_DEBUG  

   printf("bale start !\n");
   
#endif  
         
    while((0x23 !=bale[i])&&(0x23 !=bale[i+1]))
       
       i++;
    
       while(i<length)
         {
           
           while(j<num)
              { 
                if((0x23 !=bale[i])&&(0x23 !=bale[i+1]))
                   {
                     k=0;
                 
                     while((bale[i]!=0x0d)&&(bale[i+1]!=0x0a)) 
                      {
      	               valid_pack[j][k] = bale[i];
      	               k++;
      	               i++; 
                      }
                      
                      valid_pack[j][k] =0x0d;
                      valid_pack[j][k+1] =0x0a;
                      j++;
                      i++;
                      
                    }
                 else
                   i++; 
              }
          }
 
#ifdef VALID_DEBUG
      
  printf("bale ok!\n");
  
#endif   

  
}
 

 
 //----------------------包长度检验--------------------------------------------
int len_check(unsigned char* package)
{
   int count=0,i=3; //长度待验证
     while((package[i]!=0x0d)&&(package[i+1]!=0x0a))
    
            {
            	count++;
            	i++;
            }
    valid_len =i;
   return (count-2);  //减2待证
}

unsigned char* del_blank(unsigned char * string )
{
  unsigned char *pblank =string;
   while(0x10 ==*pblank)
    pblank++;
   return pblank;
}

unsigned char* is_num(unsigned char *srcstr_num,unsigned char *desstr_num)
{
   int i=0;
   unsigned char *pnum =srcstr_num;
   
#ifdef VALID_DEBUG
  
   printf("entering int \n");

#endif    
   
   while((*pnum<=0x39)&&(*pnum>=0x30)) 
         {
          desstr_num[i++] =*pnum++;
         
         }
         desstr_num[i] ='\0';
    return pnum;
}

unsigned char* is_float(unsigned char *srcstr_float,unsigned char *desstr_float)
{
    int i=0;
    unsigned char *pfloat =srcstr_float;
    
#ifdef VALID_DEBUG
  
   printf("entering float \n");

#endif   
  
     while((*pfloat<=0x39)&&(*pfloat>=0x30)||*pfloat==0x2e) //0x2e为浮点数的点号
         desstr_float[i++] =*pfloat++;
         desstr_float[i] ='\0';
      return pfloat;	
}

unsigned char*  right(unsigned char *srcstr_r,unsigned char *desstr_r,char flag)
{   
    unsigned char *pright =srcstr_r;
    
#ifdef VALID_DEBUG
  
   printf("entering right \n");
   printf("flag is %c",flag);
   
#endif 

    if('f' ==flag)
      pright=is_float(pright,desstr_r);
    else if('i' ==flag)
      pright=is_num(pright,desstr_r);
    else
      {
      	printf("data wrong!\n");
      	exit(0);
      }
      
    return pright;
}

unsigned char* left(unsigned char *srcstr_l,unsigned char *desstr_l)
{
   int i=0; 
   unsigned char *pleft =srcstr_l;
   
#ifdef VALID_DEBUG
  
   printf("entering left \n");

#endif  
  
   while(((*pleft<=0x39)&&(*pleft>=0x30))||((*pleft>=0x41)&&(*pleft<=0x5a))||((*pleft>=0x61)&&(*pleft<=0x7a)))
      desstr_l[i++] =*pleft++;
      desstr_l[i] ='\0';
   return pleft;
}

unsigned char* left_cp(unsigned char *srcstr_l,unsigned char *desstr_l)
{
   int i=0;
   unsigned char *pleft =srcstr_l;
   
#ifdef VALID_DEBUG
  
   printf("entering left_cp \n");

#endif 

   while(((*pleft<=0x39)&&(*pleft>=0x30))||((*pleft<=0x41)&&(*pleft>=0x5a))||((*pleft<=0x61)&&(*pleft>=0x7a))||(*pleft==0x2d))
      desstr_l[i++] =pleft++;
      desstr_l[i] ='\0';
   return pleft;
}


int is_equal(unsigned char src_equal)
{
	if(0x3d ==src_equal) //‘=’的ASCII码为0x3d
	   return  1;
	else
	   return  0;
}

int is_semicolon(unsigned char src_semicolon)
 {
	if(0x3b ==src_semicolon) //‘;’的ASCII码为0x3d
	   return  1;
	else
	   return  0;
 }
 
unsigned char* left_right_head(unsigned char* valid_head,int i,int no)
{
#ifdef VALID_DEBUG
  
   printf("entering int \n");
   printf("no =%d\n",no);
   
#endif     
		  
		           //start take st
	          if(*valid_head ==0x10) 
	             
	             valid_head =del_blank(valid_head); 
	              
	          else if(((*valid_head>=0x41)&&(*valid_head<=0x5a))||((*valid_head>=0x61)&&(*valid_head<=0x7a)))
	           
	              {
	              	valid_head =left(valid_head,*(valid+no)->left[i]);
#ifdef VALID_DEBUG
	                printf("left_head =%s\n",*(valid+no)->left[i]);
#endif
	              }
	          else   
	              goto LABLE0; 
	              
	          if(0!=strcmp(head_left_map[i],*(valid+no)->left[i]))
	              	             
	              goto LABLE0;
	              
	          else
	           {
#ifdef VALID_DEBUG
	             printf("valid data head ok!\n");
#endif	             
	             if(*valid_head ==0x10)
	                  
	                valid_head =del_blank(valid_head);
	                   
	             else if(is_equal(*valid_head))
	                
	                   valid_head++;
	                   
	             else if(*valid_head ==0x10)
	          
	                   valid_head =del_blank(valid_head);
	              
	             else
	                
	               goto LABLE0;
	               
	              
	             if(((*valid_head<=0x39)&&(*valid_head>=0x30))) 
	                
	                  {
	                     valid_head =right(valid_head,*(valid+no)->right[i],'i');
#ifdef VALID_DEBUG	                   
	                     printf("valid data head right data ok!\n");
	                     
	                     printf("valid right data =%s\n",*(valid+no)->right[i]);
#endif	                     
	                  }
	                   
	             else 
	                 
	               goto LABLE1;
	                
	             if(*valid_head ==0x10) 
	             
	                  valid_head =del_blank(valid_head); 
	             
	             else if(is_semicolon(*valid_head))
	          
	                 valid_head++;
	                 
	             else
	             
	                goto LABLE1;
	             }  
	          
  return valid_head; 
  
LABLE0:
	{
	  printf("valid  left data lose !\n");
	  
	  exit(0); 
	}

LABLE1:
        {
          printf("valid right data error! \n");
         
          exit(0); 
        }
        
}


unsigned char* left_right_cp(unsigned char* valid_cp ,int no)
{
  int i,k,l_lable;
  
  unsigned char valid_temp[20];
  
#ifdef VALID_DEBUG
  
   printf("entering int \n");
   printf("no =%d\n",no);
   

⌨️ 快捷键说明

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