티스토리 뷰

이제 UART를 통해서, 문자형 데이터가 아닌 실제 데이터, 즉, 바이너리 데이터를 송수신하는 프로그램을 만들어 보겠다.


데이터 통신을 하기 위해서는 AVR의 UART 프로그램을 다음과 같이 수정해 주어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void uart_tx(uint8_t data)
{
    while (!(uart->ucsr_a & UDRE));
    uart->udr = data;
}
 
uint8_t uart_rx(void)
{
    while (!(uart->ucsr_a & RXC));
 
    return uart->udr;
}
 
void uart_init(void)
{
    uint16_t    baudrate = F_CPU/UART_BAUDRATE/16;
 
    uart->ucsr_b = 0x00;
    uart->ucsr_a = 0x00;
    uart->ucsr_c = DATA_8BIT << CHAR_SZ_SHIFT; // 8,N,1
    uart->ubrr_h = (baudrate >> 8) & 0xFF;
    uart->ubrr_l = baudrate & 0xFF;
    uart->ucsr_b = (RXEN | TXEN);
}



수정된 UART에 맞게 실제 데이터를 내 보내는 부분도 수정해 주어야 한다.

ATAVRSBIN1의 세개의 센서 중에서 compass 데이터만 1초에 한번씩 내 보내는 코드를 만들어서 PC 프로그램이 데이터를 제대로 수신하는지 알아보도록 하겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void setup(void)
{
    uart_init();
    twi_init();
 
    twi_write(AK8975, 0x0a, 1);
    _delay_ms(10);
}
 
void loop(void)
{
    int     i;
 
    twi_read(AK8975, 0, data, 10);
 
    for (i=0; i<10; i++)
        uart_tx(data[i]);
 
    _delay_ms(1000);
}


17번째 줄에서 보는것처럼 uart_tx() 함수를 이용하여 Compass에서 읽어 온 데이터를 문자로 변환하지 않고 바이너리 데이터로 바로 내 보내는것을 알수 있다.


PC프로그램도 이제는 문자가 아닌 바이너리 데이터가 수신되므로 이에 맞추어 수정해 주어야 한다.

1
2
3
4
5
def OnSerialRead(self, event):
    """Handle input from the serial port."""
    text = event.data
    for i in text:
        self.dbgBox.AppendText('0x%02X ' % ord(i))




AVR에서 보내준 바이너리 데이터를 제대로 수신하여 처리 하였음을 알 수 있다.


그러나, 위의 그림에서 알 수 있는것처럼 데이터가 연속해서 들어오면 어디가 시작이고 어디가 끝인지 알 수가 어렵다.  결국 데이터 시작지점과 끝지점을 알려주어 패킷처럼 동작되도록 만들어야 한다.


이렇게 하는 방법은 다음 글에서 알아보도록 하겠다.



심화 과정 목차

'심화' 카테고리의 다른 글

패킷 통신 - CRC  (2) 2016.08.11
패킷 통신 - Start/Stop flag  (7) 2016.08.10
패킷 통신 - PC 프로그램  (0) 2016.08.03
패킷 통신 - 회로 구성  (0) 2016.07.30
패킷 통신 - Serial Packet Communication  (0) 2016.07.30
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
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
글 보관함