BASIC4MCU | 질문게시판 | uart 통신
페이지 정보
작성자 쩡쩡쭁 작성일2021-02-24 16:43 조회13,363회 댓글1건본문
ATmega128로 uart 통신을 하려 하는데 그냥 문자 송수신까진 할 수 있겠는데 문자 3개를 연속으로 전송하면 동시에 떠야합니다. 예를 들어 첫번쨰 경우, 1을 수신하고 그 다음 2,3을 수신하면 123이 동시에 나와야합니다. 또 다른 경우엔, 1을 수신하고 그 다음 2를 또 다음에는 3을 수신했을 때 123이 동시에 나와야합니다. 입력이 3개 들어올때까지 기다렸다가 한번에 뜨도록 해야하는건데 여기서 뭘 추가해야할지 모르겠습니다. 아래는 문자 송수신 코드입니다.
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/sfr_defs.h>
#include <avr/interrupt.h>void UART1_init(void);
void UART1_transmit(char data);void UART1_init(void){
UBRR1H=0x00;
UBRR1L=207;
UCSR1A |= _BV(U2X1);
UCSR1C |= 0x06;
UCSR1B |= _BV(RXEN1);
UCSR1B |= _BV(TXEN1);
}unsigned char UART1_receive(void){
while(!(UCSR1A & (1<<RXC1)));
return UDR1;
}void UART1_transmit(char data){
while(!(UCSR1A & (1<<UDRE1)));
UDR1= data;
}int main(void){
UART1_init();
while(1){
UART1_transmit(UART1_receive());
}
return 0;
}
댓글 1
조회수 13,363master님의 댓글
master 작성일
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
//
char UART1_rx(void){ while(!(UCSR1A&0x80)); return UDR1; }
void UART1_tx(char d){ while(!(UCSR1A&0x20)); UDR1= d; }
//
int main(void){
char r,r_buf[10],cnt=0;
UBRR1L=103; UCSR1B=0x18;
while(1){
r=UART1_rx();
r_buf[cnt]=r;
if(++cnt>=3){ // 3문자 수신?
UART1_tx(r_buf[0]);
UART1_tx(r_buf[1]);
UART1_tx(r_buf[2]);
cnt=0;
}
}
return 0;
}