?? pollute.c
字號:
/*********************************************************************
* 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 + -