부산IT학원/스마트컨트롤러

20140428 (PC, ATMega128 간 시리얼 통신, fread, fwrite)

EHOzlO 2014. 4. 28. 17:35

51일차









----------------------------

ATMega128 시리얼 통신

----------------------------



--- ATMega128 -> PC로 데이터 보내기

ex) 소스


- main.c


- Usart.h


- Usart.c


출력 화면




계속 통신을 시험했을 때 오류가 났었는데

ATMega128로 프로그램을 넣을 때 변환해 주는 칩을 낀 상태로 실행을 하니

제대로 실행이 안됐었다.

알고 보니 그 칩에도 TxD0, RxD0가 연결되어 보내는 신호가 잘 안됐었다.



- UBRR (((F_OSC)/((BAUD)*16L))-1)

    여기서 L을 붙인 이유는 ATMega128은 8bit이기 때문에 2byte가 넘는 수는

    계산할 수 없다. 그래서 4byte 데이터인 Long 형으로 캐스팅 해준다는 뜻.


- Usart_Tx(), Usart_Rx() 함수를 보면

현재 송신이 끝났는지, 수신이 끝났는지 확인(while문)하고 데이터를 사용한다.






- C

-----------------

파일 읽기 쓰기

-----------------



- fread, fwrite

원형

size_t fread(void * buf, size_t size, size_t count, FILE * stream);

size_t fwrite(const void * buf, size_t size, size_t count, FILE * stream);

성공시 전달인자 count, 실패 또는 파일 끝 도달시 count보다 작은 값 반환.


buf는 말 그대로 메모리 공간(정보 저장된 곳 or 정보 저장할 곳)

size, count는 서로 곱해서 buf 크기 만큼 나오면 된다.

stream은 쓰거나 읽을 파일 스트림을 말한다.



ex) 소스

#include <stdio.h>

typedef struct _smart
{
  int iNum;
  char a;
  int iNum2;
  char b;
  short c;
}Smart;

int main()
{
  FILE * fp;
  Smart test;
  Smart test2;

  printf("%d \n"sizeof(Smart) );

  fp = fopen("AA.bin""wb");

  test.iNum = 0x41424344;
  test.a = 'Z';
  test.iNum2 = 0x45464748;
  test.b = 'Y';
  test.c = 0x494A;

  fwrite(&test, sizeof(Smart), 1, fp);

  fclose(fp);



  fp = fopen("AA.bin""rb");

  fread(&test2, sizeof(Smart), 1, fp);

  printf("%08X \n", test2.iNum);
  printf("%c \n", test2.a);
  printf("%08X \n", test2.iNum2);
  printf("%c \n", test2.b);
  printf("%04X \n", test2.c);

  fclose(fp);

  return 0;
}