Atmega 128

양방향 통신(pc:atmega128)

지화명이 2010. 4. 21. 16:14

//=====main.c===================
#include <avr/io.h>


#define CPU_CLOCK 16000000
#define BAUD_RATE 19200
#define BAUD_RATE_L (CPU_CLOCK/(16l*BAUD_RATE))-1     
#define BAUD_RATE_H ((CPU_CLOCK/(16l*BAUD_RATE))-1)>>8

//통신속도의 결과 값을 입력하기 위해 상하위 비트로 구분
//16l(소문자L)은 16+L이며,연산시 값이 너무 커져 overflow가 발생하므로 32비트 연산을
//위해 16에 Long을 의미하는 l을 붙인다.


unsigned char USART_Receive(void)
{
 while(!(UCSR1A&(1<<RXC)));
 
 return UDR1;
}

unsigned char USART_Transmit(ch)
{
 while(!(UCSR1A&(1<<TXC)));
 
 return UDR1;
}

int main(void)
{
 
 DDRF=0xff;
 PORTF=0xff;
 PINC=0x00;
 
 
 UBRR1L=(unsigned char)BAUD_RATE_L; //BAUD RATE 설정
 UBRR1H=(unsigned char)BAUD_RATE_H;
 
 //no parity,1 stop bit,8bit 설정
 UCSR1C=(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
 
 //rx/tx interrupt 설정,8bit 설정
 
 UCSR1B=(1<<TXEN)|(1<<RXEN)|(0<<UCSZ2);
 
 /*
 for(i=0;i<sizeof(buf);i++) //문자단위로 전체 문자열 전송
 {
 uart_send_byte(buf[i]); //문자 1개를 직렬포트로 전송  
 }
 */
 
  
 
  while(1)
  {
   unsigned char ch=USART_Receive();
   PORTF=ch^0xff;
   USART_Transmit(ch);
   asm("NOP");
   
  }
  
 
 
 return 1;
}

//==============      c++    ======================
#include <stdio.h>
#include <windows.h>

int main(void)
{
 char szPort[15];
 wsprintf(szPort,"COM%d",1);

 HANDLE m_hComm=NULL;
 m_hComm=CreateFile(szPort,
      GENERIC_READ|GENERIC_WRITE,
      0,NULL,OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL,NULL);
 if(m_hComm==INVALID_HANDLE_VALUE)
  {
   printf("(!) Failed to create a Comm Device file");
   return FALSE;
  }

 DCB dcb;
 dcb.DCBlength=sizeof(DCB);

 GetCommState(m_hComm,&dcb);

 dcb.BaudRate=19200;
 dcb.ByteSize=8;
 dcb.Parity=0;
 dcb.StopBits=0;

 SetCommState(m_hComm,&dcb);
 
 OVERLAPPED osRead;
 OVERLAPPED osWrite;
 osWrite.Offset=0;
 osWrite.OffsetHigh=0;
 osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

 char buf;
 
 
 while(1)
  {
   printf("input:");
   scanf("%d",&buf);
   WriteFile(m_hComm,&buf,sizeof(buf),NULL,&osWrite);
   Sleep(1000);
   fflush(stdin);
   ReadFile(m_hComm,&buf,sizeof(buf),NULL,&osRead);
   printf("output:%d\n",buf);

  }
 CloseHandle(m_hComm);

 return 0;
}