본문 바로가기

ARM/강의

시리얼 통신으로 문자열 출력 함수 만들기!!

#define DELAY(A) for(iCount=0; (A) >= iCount; ++iCount)      // Delay Macro

void
 DBGU_Str(const char *cString)
{  
  while(*cString != 0)
  {  // NULL이 올때까지 TX호출
    DBGU_TX(*cString);
    ++cString;
    DELAY(30000);
  }
  return;
}
소스는 간단하다...받아온 문자열을 한문자씩 보내는데 널문자를 만날때까지 계속 반복해주면된다.
근데 위에 보면 딜레이가있는데 다른사람은 딜레이없어도 전송이 잘만되는데 나만 딜레이를 2만이상줘야
제대로 전송이 되는 것이였다....문자열 전송은 그냥 BDGU_Str("hello")이렇게 호출해주면 끝~~
거듭제곱 구하는 함수
int square(int N, int cnt) // 거듭제곱을 구하는 함수
{
  if(cnt==0// cnt가 0이면 1을 리턴
    return 1;
  else // cnt가 0을 초과할 경우
    return N*square(N,--cnt); // 자기 자신인 square함수를 부르고, cnt의 값을 1 감소
}
재귀함수호출을 이용하여 거듭제곱을 구하는 함수를 만들었다. 이것을 이용하여 상수를 문자열로 바꾸는 소스를 만들어서 통신을 해보겠다. 소스는 아래와 같다.
int main()
{
  int iCnt;
  char cBuf[]="0000";
  unsigned short usVal=1023;

  for(iCnt=04>iCnt; ++iCnt)
  {
    cBuf[3-iCnt]=((usVal/square(10, iCnt))%10)+'0';
  }
  
  DBGU_Init();  // DBGU Setting
  DBGU_Str(cBuf);

  while (1)
  {
    
  }
  return 0;
}


우선은 4자리 수만 할꺼라서 카운터를 3(0~3)까지만 하게 해놓았다. square함수를 호출하여 거듭제곱을사용하여 usVal의 값을 나눈후 나머지를 구함값+아스키코드값0을 합치면 상수에서 문자가 된다. 그러니까 첫번째를 보자면 iCnt=0 이니까 cBuf[3-0] = ((1023/1))%10)+48과 같다. 이것을 다시 풀이하면
cBuf[3]=(1023%10)+48 이란 식이되고 cBuf[3]=3+48, cBuf[3]=51 이므로 결과적으로 문자 3이 cBuf[3]에 들어간다. 이렇게 죽하면 cBuf에는 문자열 1024이 저장되어 문자열을 전송하면 하이퍼터미널에는 1023이 출력된다
제곱함수를 만들지 않고 그냥 변수하나만 추가해서 만들수도있다. 단지 만들어 놓은 함수가있어서 썼을뿐임..


'ARM > 강의' 카테고리의 다른 글

LCD + 센서 제어 프로그래밍  (0) 2011.02.25
AT91SAM7S256의 내부 구조  (0) 2011.02.16
A/D 컨버터(ADC)  (0) 2011.02.14
LED 제어 테스트  (0) 2011.02.09
링커 스크립트 분석  (0) 2011.02.08