질문게시판 > 답변 : 장비간 프로토콜 분석중 코드 질문 드립니다.

TODAY89 TOTAL2,325,746
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | 답변 : 장비간 프로토콜 분석중 코드 질문 드립니다.

페이지 정보

작성자 master 작성일2018-03-15 15:02 조회6,786회 댓글1건

본문

	

 

// DateTime : 2018-03-15 오후 3:05:39
// by Ok-Hyun Park
/*Global variables*/
static unsigned char*outftp;
static int ftpn=0;
/*****************************************************************************
pack()function
INPUTS:
i-The value to be packed into the output stream.
n-The number of nibbles it should take up.
OUTPUTS:
Deposits the packed data into the output buffer pointed to by outftp and updates
outftp as needed.
GLOBALS:
None
STATICS:
outftp,ftpn
Packs nibbles into *outftp and increments the nibble counter ftpn by the number of nibbles
packed.
pack()is private to this module,called by packit()
******************************************************************************/
void pack(unsigned int iint n){
  #ifdef NOT_80x86
    if(n==4)swab(outftp,outftp,2); /*Put into 80x86 order*/
  #endif
  if(!(ftpn&1)){ /*on an even nibble boundary?*/
    if(n>1){ *outftp++=(i&0xff); if(n>2)*outftp++=(i&0xff00)>>8; }
    else   { *outftp=i<<4;       } /*pack high nibble first*/
  }
  else{
    if(n>1){
      if(n==2){
        *outftp++|=(i&0xf0)>>4/*fill in low nibble with high nibble of next byte*/
        *outftp=(i&0x0f)<<4/*fill in high nibble with low nibble*/
      }
      else{
        *outftp++|=(i&0x00f0)>>4/*fill in nibble 3*/
        *outftp++=(i&0x000f)<<4|(i&0xf000)>>12/*nibbles 4 and 1*/
        *outftp=(i&0x0f00)>>4/*and nibble 2*/
      }
    }
    else*outftp++|=(i&0x0f); /*fill in low nibble*/
  }
  ftpn+=n;
}
/*****************************************************************************
packit()function
INPUTS:
src Pointer to integers to pack.
dst Buffer to contain packed data.
num Number of integers to pack.
OUTPUTS:
Deposits packed data in output buffer(dst),and returns number of bytes actually packed.
GLOBALS: None
STATICS: outftp,ftpn
Packs the integer data into the output buffer.
Calls pack()
******************************************************************************/
int packit(int *src,unsigned char *dst,int num){
  int iint state=16int dr,d2r,dr1=0;
  outftp=dst;
  for(ftpn=0,i=0i<numi++){
    if(!i)dr=src[i];
    else  dr=src[i]-src[i-1];
    d2r=dr-dr1;
    switch(state){
      case 16/*Note this was originally,incorrectly,(dr<128&&dr>-128)*/
        if(dr<128&&dr>-127){ state=8pack(0x8000,4); pack(dr,2); }
        else               { pack(src[i],4); }
        break;
      case 8:
        if(dr>=128||dr<=-127){ state=16pack(0x81,2); pack(src[i],4); }
        else{
          if(d2r<8&&d2r>-8){ state=4pack(0x80,2); pack(d2r,1); }
          else             {                        pack(dr,2);  }
        }
        break;
      case 4:
        if(d2r>=8||d2r<=-8){
          pack(0x8,1);
          if(dr>=128||dr<=-127){ state=16pack(0x81,2); pack(src[i],4); }
          else                 { state=8pack(dr,2); }
        }
        elsepack(d2r,1); }
        break;
      defaultreturn(-99); break;
    }
    dr1=dr;
  }
  return((ftpn+1)>>1);
}
/*****************************************************************************
unpack()function
INPUTS:
i-The number of nibbles to unpack from the packed data stream.
OUTPUTS:
The 16-bit integer value of the packed data
GLOBALS:
None
STATICS:
outftp
Returns the next nibble,byte,or word of packed data based on the size which is passed.Since
byte order for words is different on Z8002,it swaps the order of the bytes before returning a
word value.
unpack()is local to this module,called by unpackit()
******************************************************************************/
int unpack(int i){
  unsigned int j;
  if(!(ftpn&1)){ /*on an even boundary*/
    switch(i){
      case 1:
        j=(*outftp&0xf0)>>4/*pull from high nibble first*/
        if(j>7)j|=0xfff0;
        break;
      case 2:
        j=*outftp++; /*pull a whole byte*/
        if(j>127)j|=0xff00;
        break;
      case 4:
        j=*outftp++; /*pull first low byte*/
        j|=((int)(*outftp++))<<8/*or in high byte*/
        break;
    }
  }
  else/*starting in the middle of the byte*/
    j=((*outftp++)&0x0f); /*pull from low nibble first*/
    switch(i){
      case 1:
        if(j>7)j|=0xfff0/*extend sign*/
        break;
      case 2:
        j<<=4;                /*shift up a nibble*/
        j|=(*outftp&0xf0)>>4/*and grab low nibble from high nibble*/
        if(j>127)j|=0xff00;   /*extend sign*/
        break;
      case 4:
        j<<=4;                            /*shift what we have up to be nibble 3*/
        j|=(*outftp&0xf0)>>4;             /*add in nibble 4 to get low byte complete*/
        j|=((int)(*outftp++ & 0x0f))<<12/*add in nibble 1*/
        j|=(*outftp&0xf0)<<4;             /*add in nibble 2*/
        break;
    }
  }
  ftpn+=i;
  #ifdef NOT_80x86
    if(i==4)swab((char*)j,(char*)j,2); /*put into Z8002 order*/
  #endif
  return((int)j);
}
/*****************************************************************************
unpackit()function
INPUTS:
src Pointer to an input buffer containing packed data.
dst Pointer to an output buffer to fill.
n Number of integers to unpack
OUTPUTS:
Unpacked data in the output buffer(dst).Returns number of unpacked bytes.
GLOBALS:
None
STATICS:
outftp
Unpacks the packed data from src into dst.Calls unpackit().
******************************************************************************/
int unpackit(int *dst,unsigned char *src,int n){
  int state=16,size=4;
  int i,dr=0,d2r=0,dr1=0,x;
  outftp=srcftpn=0;
  for(i=0i<ni++){
AGAIN:
    x=unpack(size);
    switch(state){
      case 16:
        if(x==0x8000){ state=8size=2goto AGAIN; }
        dst[i]=x;
        if(i)dr1=x-dst[i-1];
        else dr1=x;
        break;
      case 8:
        if((x&0xff)==0x80){ state4size=1goto AGAIN; }
        if((x&0xff)==0x81){ state=16size=4goto AGAIN; }
        dr=x;
        if(i)dst[i]=dst[i-1]+dr;
        else dst[i]=dr;
        dr1=drbreak;
      case 4:
        if((x&0x0f)==0x8){ state=8size=2goto AGAIN; }
        d2r=xdr=dr1+d2rdst[i]=dst[i-1]+drdr1=drbreak;
    }
  }
  return((ftpn+1)>>1);
}

 

 

// DateTime : 2018-03-15 오후 3:02:15
// by Ok-Hyun Park
#include <stdio.h>
//
int unpackit(int *dst,unsigned char *src,int n);
//
unsigned char tr_R_Data[]={ // 59개 헥사값
  0xaf,0x09,0x00,0x80,0x68,0x16,0xb2,0x81,0x5a,0x09,
  0xcd,0x08,0x00,0x80,0x8c,0xa3,0xbb,0xd8,0xf3,0x1b,
  0x91,0x32,0x53,0x70,0x81,0x12,0x09,0xa7,0x09,0x27,
  0x1b,0x8a,0x00,0x80,0x2e,0xbe,0x80,0x4b,0xc8,0xc3,
  0xb9,0xb1,0x80,0xd8,0xb8,0xc8,0xdd,0xf2,0x05,0x1b,
  0x9b,0x2a,0x32,0x80,0x6b,0x83,0xc4,0xd5,0xe0
};
int rArray_R[40];
//
int main(void){
  unpackit(rArray_R,tr_R_Data,59);
  return 0;
}
//
static unsigned char *outftp;
static int           ftpn=0;
//
int unpack(int i){
  unsigned int j;
  if(!(ftpn&1)){ /*on an even boundary*/
    switch(i){
      case 1:
        j=(*outftp&0xf0)>>4/*pull from high nibble first*/
        if(j>7)j|=0xfff0;    //-0.07mm~0.07mm 는 nibble 로 표현
        break;
      case 2:
        j=*outftp++;        /*pull a whole byte*/
        if(j>127)j|=0xff00//j>0x81 //차이가 127보다크냐?-1.26mm~1.27mm 는 bytes로 표현?
        break;
      case 4:
        j=*outftp++;              /*pull first low byte*/
        j|=((int)(*outftp++))<<8/*or in high byte*/
        break;
    }
  }
  else/*starting in the middle of the byte*/
    j=((*outftp++)&0x0f); /*pull from low nibble first*/
    switch(i){
      case 1:
        if(j>7)j|=0xfff0/*extend sign*/
        break;
      case 2:
        j<<=4;                /*shift up a nibble*/
        j|=(*outftp&0xf0)>>4/*and grab low nibble from high nibble*/
        if(j>127)j|=0xff00;   /*extend sign*/
        break;
      case 4:
        j<<=4;                            /*shift what we have up to be nibble 3*/
        j|=(*outftp&0xf0)>>4;             /*add in nibble 4 to get low byte complete*/
        j|=((int)(*outftp++ & 0x0f))<<12/*add in nibble 1*/
        j|=(*outftp&0xf0)<<4;             /*add in nibble 2*/
        break;
    }
  }
  ftpn+=i;
  #ifdef NOT_80x86
    if(i==4)swab((char*)j,(char*)j,2); /*put into Z8002 order*/
  #endif
  return((int)j);
}
//
int unpackit(int *dst,unsigned char *src,int n){
  int state=16,size=4;
  int i,dr=0,d2r=0,dr1=0,x;
  outftp=srcftpn=0;
  for(i=0i<ni++){
AGAIN:
    x=unpack(size);
    switch(state){
      case 16:
        if(x==0x8000){ state=8size=2goto AGAIN; }
        dst[i]=x;            //rArray에 저장
        if(i)dr1=x-dst[i-1];
        else dr1=x;
        break;
      case 8:
        if((x&0xff)==0x80){ state4size=1goto AGAIN; }
        if((x&0xff)==0x81){ state=16size=4goto AGAIN; }
        dr=x;
        if(i)dst[i]=dst[i-1]+dr;
        else dst[i]=dr;
        dr1=drbreak;
      case 4:
        if((x&0x0f)==0x8){ state=8size=2goto AGAIN; }
        d2r=xdr=dr1+d2rdst[i]=dst[i-1]+drdr1=drbreak;
    }
  }
  return((ftpn+1)>>1);
}

 

코드는 별 차이가 없는 것 같습니다. 

 

요즘 PC 컴파일러들은 디버깅 기능이 좋지 않나요?

위 코드를 돌려보기에 적당한 컴파일러를 가지고 있지 않습니다.

 

 

2479,2583,2605,2527,2394,2253,2137,2044,1975,1935,
1922,1939,1989,2072,2184,2322,2471,2599,2645,2579,
2517,2450,2379,2318,2247,2168,2086,2014,1958,1923,
1909,1914,1941,1983,2033,2089,2140,2200,2277,2371

UNPACK 코드가 어떻게 생성 되든가요?

 

 //

컴파일러 옵션 중에서 최적화옵션을 끄고 컴파일 해보세요

최적화가 많을 수록 엉뚱하게 실행 됩니다.

 

 

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 1

조회수 6,786

몽규님의 댓글

몽규 작성일

글이 지저분해져서 댓글 말고 답변으로 달겠습니다.

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
질문 질문드립니다. 이호 18-04-06 6447
답변 답변글 답변 : 아두이노 시리얼 입력으로 FND 구동댓글[2] master 18-04-06 9795
질문 블루투스 신호 세기를 측정하려면 어떻게 해야하나요?? 노동 18-04-04 6995
답변 답변글 답변 : 블루투스 신호 세기를 측정하려면 어떻게 해야하나요?? master 18-04-04 8971
질문 아두이노 우노 및 ESP8266 와이파이 모듈 관련 질문 exia 18-04-04 6595
답변 답변글 답변 : 아두이노 우노 및 ESP8266 와이파이 모듈 관련 질문 이미지 master 18-04-04 5869
질문 AVR 4 질문요~ 비공개 18-04-04 5833
답변 답변글 답변 : AVR 4 질문요~ master 18-04-04 6153
질문 AVR atmaga128댓글[1] 첨부파일 비공개 18-04-03 7363
답변 답변글 답변 : AVR atmaga128 1개의 파일로 합침댓글[4] master 18-04-03 15190
답변 답변글 답변 : AVR atmaga128 소스코드 정리 master 18-04-03 6411
답변 답변글 답변 : 답변 : AVR atmaga128 소스코드 정리댓글[3] 첨부파일 턴업 18-04-04 11605
질문 웜기어 추가질문 드립니다!댓글[1] 까스활명 18-04-02 7622
질문 DMA 송수신 관련 질문 드립니다. 몽규 18-04-02 6942
답변 답변글 답변 : DMA 송수신 관련 질문 드립니다. master 18-04-02 6063
답변 답변글 답변2 : DMA 송수신 관련 질문 드립니다.댓글[1] master 18-04-02 6923
질문 웜기어를사용 한 스텝모터 제어댓글[3] 비공개 18-04-01 12786
답변 답변글 답변 : 웜기어를 사용 한 DC모터 이미지 master 18-04-02 7078
질문 왕초보가 질문 하나 또 드립니다댓글[1] Songyoun 18-03-31 7019
질문 자이로가속도 센서 제어댓글[2] 빠박이빠박 18-03-31 9054
질문 PWM관련 질문 드립니다 Songyoun 18-03-29 6252
답변 답변글 답변 : PWM 디지털제어 = 전력제어 master 18-03-29 5856
질문 ATmega128 USART 통신 관련해서 질문드립니다.댓글[1] 27315co 18-03-28 8655
답변 답변글 답변 : ATmega128 USART 통신 관련해서 질문드립니다.댓글[1] master 18-03-28 7732
질문 아두이노 프로그램 시리얼모니터에 나타내는건데요 cimi 18-03-28 5986
답변 답변글 답변 : 소스코드 실행 결과를 적어주세요 master 18-03-28 6128
질문 아두이노 아키텍처 질문댓글[1] 뭘보노옹 18-03-27 8841
질문 밑에 질문 관련 다시 올립니다. exia 18-03-27 6442
답변 답변글 답변 : 소스코드 오류 몇개 수정했습니다.댓글[1] master 18-03-27 6660
질문 아두이노 우노 dht11 센서 두개 동작 질문드립니다. exia 18-03-27 5734
게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기