9. ATmega162 시리얼 통신 - 프로토콜

|

[뇌를 자극하는 하드웨어 - ATmega162 시리얼 통신 ( 프로토콜 ), IAR]

간단한 문자를 주고 받는것만으로는 많은 제약이 존재하게 된다.

시리얼 통신을 지원하는 기기들은 보면 의미있는 단어들로 통신을 규약하게 되는데, (이른바 프로토콜) 이번에는

특정 단어를 수신했을때 특정 단어를 리턴하는 것을 살펴보겠습니다.


1. 목표

 -미리 정의된 특정 단어를 수신해서, 단어별로 다른 단어를 리턴한다.


2.소스

#include<iom162.h>
#include<ina90.h>
#include<stdio.h>


char rx=0;
int m_intNowBufferSize=0;
char *m_RESULT;

char m_MessageBuffer[512];

void Putch(char data)
{
  while(!(UCSR0A & 0x20));
  UDR0=data;
}

void PRINTMESSAGE(char *temp)
{
   char *pStr; 
  
   pStr=temp;
   while(*pStr)
   {
     Putch(*pStr++);
   }
}

void addMessage(char _rx)
{
  
  m_MessageBuffer[m_intNowBufferSize++]=_rx;
  m_MessageBuffer[m_intNowBufferSize]='\0';
   
}
  
char* checkMessage()
{
  
  if(strstr(m_MessageBuffer,"\r\n") != NULL)
  {
     if(strstr(m_MessageBuffer,"NAME?") != NULL)
    {
       return "HONG JIN HYEON";
    }
    else if(strstr(m_MessageBuffer,"REGION?") != NULL)
    {
       return "CHEONGJU";
    }
    else if(strstr(m_MessageBuffer,"LOVE?") != NULL)
    {
       return "I LOVE YOU!!";
    }
    else
    {
      return "ERROR";
    }
  }
  else
  {
    return "NO";
  }
     
}


#pragma vector=USART0_RXC_vect
__interrupt void USART0_RXC(void)
{  
  __disable_interrupt();
  
   rx=UDR0;
  
   addMessage(rx);
   m_RESULT=checkMessage();
   
   if(strcmp(m_RESULT,"NO")!= 0)
   {
     // \r\n으로 정상적으로 요청했을시에
      PRINTMESSAGE(m_RESULT);
      m_intNowBufferSize=0;
      Putch('\r');
      Putch('\n');
   }
     
    __enable_interrupt();
}  



void main(void)
{
  
  DDRB=0xFF;
  PORTB=0xFF;
  
  UCSR0A=0x00;
  UCSR0B=0x98;
  UBRR0L=103;
  UBRR0H=0;
  
  __enable_interrupt();
  
  PRINTMESSAGE("안녕하세요\r\n");
  
  while(1);
    
}


 -void addMessage(char _rx) : 데이터를 수신했을때 버퍼에 메시지를 추가한다. 

 -m_MessageBuffer[m_intNowBufferSize]='\0' : '\0'를 마지막에 추가하면  해당 인덱스 전까지만 문자가 있는것으로 처리가 된다. 

 -char* checkMessage() : 데이터 수신후 데이터를 버퍼에 추가후에  입력된 형식대로 있는지 판단해서 결과 문자를 리턴한다.



3.결과


 -등록된 프로토콜이 아닌 단어는 ERROR로 모두 처리한다.


4.피드백

 -C#만 하다보니 C 갑자기 하려니 너무 거리감이 많네요. 문자열 처리부분에서 세밀하게 처리 해줘야 하니 너무 답답 ㅜㅜ

 -C를 안하셨던 분들이나 너무 오래되서 잊어 버리신 분들은 포인터, 문자열 관련 함수들을 공부하시는게 좋을듯 하네요.

  (다음에 한번 글 올릴게요 저도 공부할겸 ㅎㅎ)

 -우선 테스트 용도로 소스를 만든거라서 메모리 해제 부분이나 효율면에서는 좋지 않을 것입니다. ( 추후에 수정해서 다시 올릴게요 )


And