본문 바로가기
코스웨어/15년 스마트컨트롤러

20150429-33번-홍준모 - <hardware>데이터 수신(usart), <software>파일과 스트림, 그리고 기본적인 파일의 입출력

by 알 수 없는 사용자 2015. 4. 29.
728x90
반응형

<Hardware>


오늘 수업 내용 : 데이터 수신

소스 코드 : 어제 했던 것 그대로 활용

USART 직렬 통신을 좀더 편하게 할 수 있는 프로그램 Comportmaster를 다운로드.


cfile29.uf.145B94024B9F2A684AFD93.exe




좀 더 자세히 사용법을 알고 싶으신 분들께.


Comportmaster 사용법.

 cfile25.uf.1452FA0F4BA31B905F0C85.pdf


○폴링 방식은 데이터를 받으면(수신) 제때제때 처리를 못해준다.

데이터가 짤리거나 이상한 것이 수신되거나 한다.

그리하여 결론적으론 송신 쪽에는 폴링 방식(while)수신 쪽에는 인터럽트를 달아야 올바른 송,수신이 가능하다.


#include <stdio.h>

#define DDRE  (*((volatile unsigned char *)0x2D))
#define UCSR0A  (*((volatile unsigned char *)0xC0))
#define UCSR0B  (*((volatile unsigned char *)0xC1))
#define UCSR0C  (*((volatile unsigned char *)0xC2))
#define UBRR0H  (*((volatile unsigned char *)0xC5))
#define UBRR0L  (*((volatile unsigned char *)0xC4))
#define UDR0  (*((volatile unsigned char *)0xC6))

void __vector_25(void)__attribute__((signal,used,externally_visible));

void __vector_25(void)  //받은 것을 그대로 인터럽트 처리 해주는 
{  
  Putch(UDR0);  //UDR0 에 들어간 data 값을 그대로 출력
}

void USART_Init(unsigned int baud)
{
//set baud rate
  UBRR0H = (unsigned char)(baud>>8);
  UBRR0L = (unsigned char)baud;

//Enable receiver and transmitter
  UCSR0A = 0b00000000;  //2배속 mode, 상태랑 관련(셋팅)
  UCSR0B = 0b10011000;  //--> ★통신을 쓸건지 말건지 설정. RXENn=1,TXENn=1 또한 RXCIEn=1(수신이 완료되면 인터럽트 발생)

//Set frame format : 8data, 2stop bit
  UCSR0C = 0b00000110;  //상태랑 관련(셋팅)
  SREG |= 0b10000000;  //global interrupt enable
}

void Putch(unsigned char data)
{
//wait for empty transmit buffer
  while(!(UCSR0A & 0b00100000));  //UDREn=1, 데이터가 없다면 반복, 있다면 UDR0에 데이터를 밀어넣고 출력 기다림.
  UDR0 = data;
  return;
}

unsigned char Getch(void)
{
  while(!(UCSR0A & 0b10000000));
  return UDR0;
}

int main(void//폴링방식, 수신 만듬
{
  unsigned char a;

  DDRE = 0b11111110;  //TX : out, RX : in

  USART0_init(103);

  while(1)
  {
    //a = Getch();  받은걸 그대로 뱉어 내는 모양(메아리)
    //Putch(a);
    //putstr("good morning.\n");    
  }
  
  return 0;
}

/*
Reverb : 박수 치면 퍼져나가는 소리(울리는 소리)
Delay  : 시간이 지연되서 똑같은게 계속계속 나오는 

에코되어서 다시 돌아오는 것을 짜본다.

*/



여기서 led로 응용할 수도 있다.

#define DDRE  (*((volatile unsigned char *)0x2D))
#define UCSR0A  (*((volatile unsigned char *)0xC0))
#define UCSR0B  (*((volatile unsigned char *)0xC1))
#define UCSR0C  (*((volatile unsigned char *)0xC2))
#define UBRR0H  (*((volatile unsigned char *)0xC5))
#define UBRR0L  (*((volatile unsigned char *)0xC4))
#define UDR0  (*((volatile unsigned char *)0xC6))

unsigned char a;

void __vector_25(void)__attribute__((signal,used,externally_visible));

void __vector_25(void)  //받은 것을 그대로 인터럽트 처리 해주는 
{  
  //Putch(UDR0);  UDR0 에 들어간 data 값을 그대로 출력
  a = UDR0;
}

void USART_Init(unsigned int baud)
{
//set baud rate
  UBRR0H = (unsigned char)(baud>>8);
  UBRR0L = (unsigned char)baud;

//Enable receiver and transmitter
  UCSR0A = 0b00000000;  //2배속 mode, 상태랑 관련(셋팅)
  UCSR0B = 0b10011000;  //--> ★통신을 쓸건지 말건지 설정. RXENn=1,TXENn=1 또한 RXCIEn=1(수신이 완료되면 인터럽트 발생)

//Set frame format : 8data, 2stop bit
  UCSR0C = 0b00000110;  //상태랑 관련(셋팅)
  SREG |= 0b10000000;  //global interrupt enable
}

void Putch(unsigned char data)
{
//wait for empty transmit buffer
  while(!(UCSR0A & 0b00100000));  //UDREn=1, 데이터가 없다면 반복, 있다면 UDR0에 데이터를 밀어넣고 출력 기다림.
  UDR0 = data;
  return;
}

unsigned char Getch(void)
{
  while(!(UCSR0A & 0b10000000));
  return UDR0;
}

int main(void//폴링방식, 수신 만듬
{
  DDRE = 0b11111110;  //TX : out, RX : in

  USART0_init(103);

  while(1)
  {
    if(a == 'A' || a == 'a')
    {
      //Turn on led
      
    }
    else if(a == 'B' || a == 'b')
    {
      //Turn off led

    }
    //a = Getch();  받은걸 그대로 뱉어 내는 모양(메아리)
    //Putch(a);
    //putstr("good morning.\n");    
  }
  
  return 0;
}

/*
Reverb : 박수 치면 퍼져나가는 소리(울리는 소리)
Delay  : 시간이 지연되서 똑같은게 계속계속 나오는 

에코되어서 다시 돌아오는 것을 짜본다.

*/


<Software>



수업 내용 : 파일과 스트림, 그리고 기본적인 파일의 입출력 (p.502~)


스트림이란

: 쉽게 정리해서 사용자가 구현하려는 프로그램에서 파일을 사용하기 위해서는 파일(File)과 프로그램 사이에 다리를 놓아야 하는데 이 다리를 스트림이라  부른다.

하지만 실제로 다리가 놓이는 것은 아니며 스트림이 형성이 되었다고 한다면 이렇게 이해를 하면 좋을 것 같다.

☞  "파일로부터 데이터를 읽어 들일 (파일에 데이터를 쓸) 기본적인 준비가 완료 되었다."

그리고 알아두어야 할 점은 운영체제가 파일의 구조를 결정하고 관리하기에 스트림의 형성도 운영체제가 알아서 해준다.


(p.503)

#include<stdio.h>

FILE *fopen(const char *filename, const char *mode);
  - 파일과의 스트림 형성 성공 시 해당 파일의 FILE 구조체 변수의 주소 값, 실패 시 NULL값 포인터로 반환

fopen 함수 호출을 통한 파일과의 스트림 형성과 FILE구조체

즉, fopen 함수는 프로그램상에서 파일과의 스트림을 형성할 수 있는 함수 이다.


FILE은 file 이라는 기본 자료형이 존재하지 않으므로 FILE은 구조체의 이름이라 는 것을 유추해 낼 수 있다.

하지만 굳이 FILE 구조체가 어떻게 정의 되어 있는지는 알 필요가 없다.


자동차로 예로 들자면 그 차를 끌고 어디로 갈 것인지, 무엇을 할 것인지가 중요한 것이지

차의 내부 내용은 필요가 없다라는 것이다.( == 차를 뜯어보려 사는 것이 아니라는 것이다.)


단지 중요한 것은 fopen 함수가 반환하는 FILE 구조체의 포인터는 파일을 가리키기 위한 용도로 사용되며,

fopen 함수가 호출되면 FILE 구조체 변수가 생성된다.



#include <stdio.h>

int main(void)
{
  FILE * fD;

  fD = fopen("a.txt","wt");  // 파일의 이름 : a.txt (을) 어떻게 : wt (write text mode로)

  return 0;
}
/*
이런 방법으로 파일을 만들 수도 있고 닫을 수도 있다.
fopen -> open , create 이렇게 바로 단정지어 생각할 수 있는데,
하지만 이 단어에 익숙해 지면 안된다. win32 에는 마이크로 소프트 사에서 직접 만든 언어가 따로 있다.
createFile() 이라는 함수가 따로 있다.

c에서는 파일을 여는 기능, 생성하는 기능을 같이 쓰고 있다.

중요 안점은 
'고정 관념'을 버려라 라는 것이다.
*/




(p.505 예제 1)


<리눅스에서>



<dos>

하트3

필기하다 놓쳤습니다..

리눅스에서나 dos에서나 결과는 같습니다.


(p.505 예제 1(수정))


<dos에서>





<리눅스에서>










728x90