티스토리 뷰
이제 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 |