RS232 통신 예제 코드

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