본문 바로가기

[AVR]/AT90USB

[AT90USB1287-EX] 이더넷 테스트 - TCP/IP를 이용한 광센서 데이터 전송 테스트

[AT90USB1287-EX] 이더넷 테스트 - TCP/IP를 이용한 광센서 데이터 전송 테스트


[AT90USB1287-EX] 보드에는 하드웨어 TCP/IP 모듈인 W5100을 메모리 제어(다이렉트) 방식으로 연결할 수 있다. 
간단히 TCP/IP  동작확인 테스트를 위해 이더넷으로 LED 제어 및 ADC값을 읽어오는 예제를 테스트 해 보았다.


TCP/IP 호스트 프로그램
기존에 C#으로 작성했던 TCP예제를 그대로 사용하기로 한다.





AT90USB1287 TCP/IP 전송 테스트 동영상
보드에 연결되어 있는 LED를 제어하고 ADC값(CdS)을 읽어와 그래프로 출력하는 예제를 작성해 보았다.




[AT90USB1287-EX] TCP 서버 처리 함수
ProcessTCPS() 함수는 루프를 돌면서 이더넷으로 데이터가 전송되면 필요한 처리를 한다.
void ProcessTCPS(unsigned int sock)
{
    unsigned int len;
 unsigned char data_buf[TX_RX_MAX_BUF_SIZE];
 unsigned int port = MY_LISTEN_PORT;

 switch (getSn_SR(sock))
 {
  // Socket CLOSED일 경우      
 case SOCK_CLOSED:
   if(!m_SokStatus1)m_SokStatus1 = 1;
  
  //socket 초기화 하고
  if(socket(sock,Sn_MR_TCP, port,0x00) == 0)
  {
   DebugPrint("Fail to create socket.");
   m_SokStatus1 = 0;
  }
  else
  {
   //접속대기
   listen(sock);
  }
  break; 


 case SOCK_ESTABLISHED:
  //수신데이터가 있으면
  if((len = getSn_RX_RSR(sock)) > 0)    
  {
      if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE; 
      //데이터 수신
      en = recv(sock, data_buf, len);   
   
     //수신데이터 처리
     //send(sock, data_buf, len);    
     EthernetTest(data_buf, len);
  }  
  break;


 case SOCK_CLOSE_WAIT:                             
  //If the client request to close
  disconnect(sock);
  
  m_SokStatus1 = 0;
  break;  
 
    default:
      
        break;
 } 
}


[AT90USB1287-EX] 이더넷 데이터 수신 처리 처리 함수
//-----------------------------------------------------------------------------
//수신데이터 처리

void EthernetTest(unsigned char *pRcvBuffer, unsigned int len)
{
 unsigned int i;
 char buf[32];
 DebugPrint("Read Data[%d]\r\n", len);
 
 //Packet CMD Check
 if(pRcvBuffer[0] == 0x55)
 {
  switch(pRcvBuffer[1])
  {
   case '0':
    Led1Off();
    break;
    
   case '1':
    Led1On();
    break;
    
   case '2':
    Led2Off();
    break;
    
   case '3':
    Led2On();
    break; 
    
   case 'r':
    sprintf(buf, "%d\r\n", AdcRead(2));
    send(SOCK_TCPS, buf, strlen(buf));
    break;      
  }
 }
}
반응형