뉴티씨



  • HOME
  • 고객지원
  • 질문답변

 

 
시리얼 통신 코드질문드립니다.
 글쓴이 : 조민준
작성일 : 17-11-17 13:01
조회 : 3,295  
현재 pc쪽에서 통신을받아 atmega128로 모터를 제어 하려고합니다.
pc쪽에서 변수 string으로 숫자1~5를 보내주고 있는데요
아래소스 조건처럼 str ="1"
이런식으로 해도 avr에서 받아지는건지 궁금합니다. 일단 해봤는데 작동이 되지않아 문의드립니다.

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>    // memcpy 함수 사용을 위해 헤더파일 추가

 
 
char rx_buf[50];  // 문자열 저장 버퍼. 배열수는 넉넉히 50
char str[50]; // 도착한 문자열을 출력할 때 쓸 배열
char rx_ch;
unsigned char rx_cnt=0;
char rx_flag=0;
 
void USART0_init(unsigned int UBRR0)
{
    UBRR0H=(unsigned char)(UBRR0>>8);
    UBRR0L=(unsigned char)UBRR0;
    UCSR0B=(1<<RXEN0)|(1<<RXCIE0)|(1<<TXEN0);
}
 
ISR(USART0_RX_vect)
{
    rx_ch=UDR0;//도착한 데이터 저장
    rx_buf[rx_cnt++]=rx_ch;// 배열에 한문자씩 저장
    if(rx_cnt==16) // 16개 문자가 도착하면
    {
        memcpy(str,rx_buf,16); // str에 rx_buf 복사
        str[16]=0; // str에 저장된 문자열 뒤에 null문자
        rx_flag=1; //플래그 SET
        rx_cnt=0; // 카운트 초기화
    }
}
 
int main(void)
{
    USART0_init(103);
    sei();
PORTB=0x00;    // 포트B의 초기상태는 모두 꺼짐 논리0 (0V)입니다.
DDRB=0xFF;    // 포트B의 8비트 전체를 출력으로 설정합니다.

    while(1)
    {
        if(str=="1")
        {
PORTB = (1<<PB0) | (0<<PB1);    // 포트B의 0,1번 핀에 각각 5V, 0V출력
_delay_ms(1000);    // 위 상태를 1초 동안 유지합니다.
PORTB = (0<<PB0) | (0<<PB1);    // 포트B의 0,1번 핀에 각각 0V, 0V출력
_delay_ms(4000);    // 위 상태를 4초 동안 유지합니다.
PORTB = (0<<PB0) | (1<<PB1);    // 포트B의 0,1번 핀에 각각 5V, 0V출력
_delay_ms(1000);    // 위 상태를 1초 동안 유지합니다.
PORTB = (0<<PB0) | (0<<PB1);    // 포트B의 0,1번 핀에 각각 0V, 0V출력
_delay_ms(4000);    // 위 상태를 4초 동안 유지합니다
        }

    }
 
}

 
   
 

 


1