usart.h
#ifndef _USART_H #define _USART_H class Usart{ public: void USART_init(unsigned int ubrr); void USART_Transmit(unsigned char data); char USART_recv(void); void putString(char msg[]); int getUBRR(int baud); int getUBRR(int baud,unsigned long fosc); }; #endif
usart.cpp
#include <avr/io.h> #include "usart.h" int Usart::getUBRR(int baud){ unsigned long fosc = 16000000; return (fosc/(16*(unsigned long)baud)-1); } int Usart::getUBRR(int baud, unsigned long fosc){ return (fosc/(16*(unsigned long)baud)-1); } void Usart::USART_init(unsigned int ubrr){ UBRR0H = (ubrr>>8); UBRR0L = ubrr; UCSR0B = _BV(RXEN0)|_BV(TXEN0); //RX-TX enable UCSR0C = (3<<UCSZ00);//define data frame: CSZ = CharacterSiZe } void Usart::USART_Transmit(unsigned char data){ loop_until_bit_is_set(UCSR0A,UDRE0); UDR0 = data; } char Usart::USART_recv(void) { while(!(UCSR0A & (1<<RXC0))); return UDR0; } void Usart::putString(char msg[]) { int i; for(i=0;msg[i];i++){ USART_Transmit(msg[i]); } }
main.cpp
#include "usart.h" int main(void){ Usart u; int ubrr = u.getUBBR(9600); u.USART_init(ubrr); u.putString("Hello!\n"); char msg; while(1){ msg = u.USART_recv(); u.USART_Transmit(msg); } return 0; }
Arduinoの同等コード
void setup(){ Serial.begin(9600); Serial.println("Hello"); } void loop(){ while(Serial.available()>0){ char s = Serial.read(); Serial.print(s); } }
Arduinoの同等コードのメモリ使用
AVR Memory Usage ---------------- Device: atmega328p Program: 1984 bytes (6.1% Full) (.text + .data + .bootloader) Data: 201 bytes (9.8% Full) (.data + .bss + .noinit)
cppのメモリ使用状況
AVR Memory Usage ---------------- Device: atmega328p Program: 446 bytes (1.4% Full) (.text + .data + .bootloader) Data: 8 bytes (0.4% Full) (.data + .bss + .noinit)
SerialクラスはSRAM領域を多く使うみたい。