728x90
반응형
데이터를 니블로 잘라서 보내는 방법의 예제 입니다.
송신
#include <mega128.h>
#include <delay.h>
#define U_C unsigned char
#define U_I unsigned int
#define STX 0x02
#define ETX 0x04
//
struct RTX_strt{ U_C c[2]; U_I i[4]; float f[2]; }rtx;
//
void TX0_CHAR(U_C Sdata){ while(!(UCSR0A&0x20)); UDR0=Sdata; } // 송신함수
interrupt [USART0_RXC] void usart0_rx_isr(void){ // 수신 인터럽트
U_C R0data;
R0data=UDR0;
}
void tx_data(){
U_C i, tp;
TX0_CHAR(STX);
for(i=0;i<18;i++){
tp=rtx.c[i];
TX0_CHAR((tp>>4)|0x30);
TX0_CHAR((tp&0x0F)|0x30);
}
TX0_CHAR(ETX);
}
void main(void){
DDRE=2; // TXD0 PORTE.1
UCSR0A=0; UCSR0B=0x98; UCSR0C=6; UBRR0H=0; UBRR0L=103; //9600
#asm("sei")
while(1){
delay_ms(1000);
tx_data();
}
}
수신
#include <mega128.h>
#include <delay.h>
#define U_C unsigned char
#define U_I unsigned int
#define STX 0x02
#define ETX 0x04
//
struct RTX_strt{ U_C c[2]; U_I i[4]; float f[2]; }rtx;
U_C rx_cnt=0;
U_C rx_buf[100];
//
void TX0_CHAR(U_C Sdata){ while(!(UCSR0A&0x20)); UDR0=Sdata; } // 송신함수
interrupt [USART0_RXC] void usart0_rx_isr(void){ // 수신 인터럽트
U_C R0data, i;
R0data=UDR0;
if(R0data==STX){ rx_cnt=0; }
else if(R0data==ETX){
for(i=0;i<18;i++){
rtx.c[i]=((rx_buf[i*2]&0x0F)<<4) + (rx_buf[i*2+1]&0x0F);
}
rx_cnt=0;
}
else{ rx_buf[rx_cnt++]=R0data; }
}
void main(void){
DDRE=2; // TXD0 PORTE.1
UCSR0A=0; UCSR0B=0x98; UCSR0C=6; UBRR0H=0; UBRR0L=103; //9600
#asm("sei")
while(1){
}
}
728x90
반응형
'교육 > AVR' 카테고리의 다른 글
RS232 통신의 기초코드 (2) | 2022.10.30 |
---|