atmega128 usart 프로그램에서 write함수에 대해서 질문드려요
글쓴이: 콩수니 / 작성시간: 목, 2012/02/16 - 8:23오후
안녕하세요 atmega128과 리눅스와 usart 간단한 usart 통신 프로그램을 짜고있는데요
궁굼한것과 잘안되는점이 있어서 질문드립니다.
먼저 atmega128쪽은 인터럽트 방식으로 하는 usart통신을 구성하였습니다
일부 소스를 제외하고 메인 소스와 수신쪽 소스입니다
메인 소스부분
----------------------------
while (1) { PORTA.0=0xff; delay_ms(500); PORTA.0=0; delay_ms(500); }
---------------------------
수신부분
interrupt [USART0_RXC] void usart0_rxc(void) { ch = UDR0; // 수신 버퍼로부터 데이터 읽어 char ch 에 저장 PORTA =0xff; delay_ms(3000); UCSR0B |= 0x20; }
간단히 보시면 알겠지만 감빡 거리다가 신호가 오면 3초가 불이 계속 켜져있는 프로그램입니다
그리고 c 소스로 atmega128쪽에 usart 통신을 하려합니다.
리눅스에서 실행할 c 소스
#include <stdio.h> #include "Serial.h" int main(){ int nSerial; char a='a'; nSerial = OpenAtmega(); //"Serial.c에서 만든 함수입니다. 연결을 해주고 serial값을 넘겨줍니다. write(nSerial,'a',5); return 0; }
-----------------------------
위에 소스 처럼 하면 usart쪽에서 제가 원하는 반응이 옵니다
근데 궁굼한건
write(nSerial,a,5); 이함수에서 5를 1이나 2,3,4로 하면 안됩니다. 5이상에 숫자를 하면 되더군요.
5가 보낼 버퍼에 크기로 알고있는데 잘 모르겠네요
그리고 만약 atmega128쪽 수신 소스를 아래와 같이 수정하면 if문을 걸었습니다,
interrupt [USART0_RXC] void usart0_rxc(void) { ch = UDR0; // 수신 버퍼로부터 데이터 읽어 char ch 에 저장 if(ch=='a'){ PORTA =0xff; delay_ms(3000); } UCSR0B |= 0x20; }
문자 a가올때만 작동하도록 하였습니다
그리고 리눅스 c에서 write(nSerial,'a',5); 라고 작성하고
실행하면 atmega가 반응이 없어요
인코딩쪽 문제인가요??
결국 2가지 질문입니다
1.write()함수에 세번째 인자가 정확히 어떤 역할을하는지?
2.리눅스 c에서 'a' 라고 신호를 보냈을때 atmega에서 if(ch=='a') 라고 해놓았을때 신호를 받고도 왜 같다고 하지 않는지.
입니다.
간단한거같은데 다소 질문이 길어졌네요.
답변 부탁드립니다.
Forums:
댓글 달기