티스토리 뷰

C언어

시리얼 통신으로 데이터 주고 받기

시작이반입니다 시작이반입니다 2021. 8. 26. 03:00

시리얼 통신으로 데이터 주고 받기

시리얼 통신을 이용하여 데이터를 주고 받는 프로그램을 작성합니다. SCON 레지스터에 있는 TI, RI 플래그를 폴링방식으로 체크해서 데이터를 전송하는 방식입니다. #include typedef unsigned char byte; void init_serial(void) { TMOD = 0x20; PCON = 0x80; SCON = 0x52; TH1 = 0xfd; TR1 = 1; SBUF = 0; } byte RX_D(void) { while(!RI); RI=0; return(SBUF); } void TX_D(byte buffer) { while(!TI); TI=0; SBUF = buffer; } void main() { byte rx; init_serial(); /* Xtal:22.1184 MHz, 38400 Baud */ do { rx = RX_D(); TX_D(rx); P1 = ~rx; } while(1); } init_serial() 함수에서 TMOD = 0x20; 명령은 타이머 1 을 모드 2 로 설정하여 TH1 을 오토 리로드 되는 시정수로 사용합니다. PCON = 0x80; 명령은 PCON 의 상위 비트 SMOD 를 1 로 셋 시켰습니다. SCON = 0x52; 명령은 SM0 SM1 = 0 1 -> 로 설정 시리얼 통신모드 1 로 설정.(8비트 통신 보레이트 변경) REN = 1 -> 수신 가능 하도록 설정. TI = 1 -> 송신이 완료되어 다음 송신을 할 수 있도록 송신 플래그를 셋 시킴. TH1 = 0xfd; 명령은 보레이트를 38400 으로 하기 위한 시정수 TR1 = 1; 타이머 1 을 동작시켜 보레이트를 발생하도록 함. byte RX_D(void) 함수는 데이터를 수신하는 함수입니다. while(!RI); 명령은 RI 플래그를 체크합니다. RI 플래그는 데이터 수신이 되면 1 이 되므로 1 이 될때까지 (데이터가 수신될 때까지) 무한 루프를 실행합니다. - 하이퍼 터미널을 사용하여 PC 에서 데이터 전송이 되면 RI 플래그가 1 이 됩니다. RI = 0; RI 플래그를 0 으로 클리어 시킵니다. - RI, TI 플래그는 자동으로 클리어 되지 않습니다. 반드시 프로그램상에서 클리어 시켜주어야 합니다. return(SBUF); 수신된 데이터는 자동으로 SBUF 레지스터에 저장됩니다. 이값을(SBUF) 리턴해서 수신된 데이터를 처리할 수 있도록 합니다. void TX_D(byte buffer) 함수는 데이터를 송신하는 함수입니다. while(!TI); 명령은 TI 플래그를 체크합니다. TI 플래그는 데이터 송신이 완료되면 1 이 되므로 데이터 송신이 완료되었나를 체크해서 다음 데이터를 보낼 수 있을 때까지 기다립니다.(무한 루프 실행) TI=0; 데이터 송신이 완료되었음을 확인하고, 다시 TI 플래그를 0 으로 해 놓고, SBUF = buffer; 매개변수로 받은 전송할 데이터(buffer)를 SBUF 레지스터에 입력합니다. SBUF 에 입력된 데이터는 자동으로 한 비트씩 송신되고 송신이 완료되면 TI 플래그는 1 이 됩니다. main() 함수에서는 do while 무한 루프에서 RX_D 함수에서 받은 데이터를 rx 변수에 대입하고 이 값을 다시 TX_D 함수에 보냅니다. 즉, 하이퍼 터미널로부터 받은 데이터를 그대로 다시 하이퍼 터미널에 보내는 것입니다. 마지막 줄에 P1 = ~rx; 명령은 받은 데이터를 LED 에 출력하는 명령입니다. LED 는 부논리로 연결되어 있어서 비트 NOT("~") 을 해서 출력했습니다. "A" 가 전송되었다면 LED 에 (MSB) 0 1 0 0 0 0 0 1 (LSB) 불이 들어 올 것입니다.

댓글
댓글쓰기 폼
공지사항
최근에 달린 댓글
Total
1,626
Today
0
Yesterday
15
링크
TAG
more
«   2021/10   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
글 보관함