AVR tabanlı projelerde seri iletişim sıkça ihtiyaç duyulan ama zaman zaman karmaşık hale gelen bir konudur. C++ diline uygun, sade ve anlaşılır bir kütüphane bulmakta zorlandım. Türkçe kaynak sayısı da oldukça az olduğu için bu projeyi geliştirip paylaşmak istedim. Böylece hem kendim için yeniden kullanılabilir bir altyapı oluşturmuş oldum, hem de az da olsa başkalarına fayda sağlamayı hedefledim.
Sorularınızı, önerilerinizi ve yorumlarınızı GitHub yorumları üzerinden paylaşabilirsiniz. Birlikte geliştirebiliriz.
- Donanımsal UART (USART0) kullanımı
- RX tarafı kesme (interrupt) destekli
- TX tarafı bloklama (polling) yöntemiyle çalışır
- 64 baytlık ring buffer
print,write,read,available,flush,clearBufferfonksiyonları
MySerialCom(unsigned long baud)→ UART haberleşmesini başlatır, baud rate ayarı yapar.void write(char data)→ Tek karakter gönderir (TX).void print(const char* str)→ Null-terminatörlü C string'ini UART üzerinden gönderir.void print(int num)→ Sayısal değeri string'e çevirip UART üzerinden gönderir.char read()→ RX buffer'dan bir karakter okur. Veri yoksa 0 döner.bool available()→ RX buffer'da okunabilir veri olup olmadığını kontrol eder.void flush()→ TX buffer boşalana kadar bekler.void clearBuffer()→ RX buffer’ı temizler (head ve tail sıfırlanır).void config(uint8_t dataBits, char parity, uint8_t stopBits)→ UART çerçevesini yapılandırır.dataBits: 5–9 arası,parity: 'N' (None), 'E' (Even), 'O' (Odd);stopBits: 1 veya 2.
MySerialCom serial(9600); // Baud rate tanımı
serial.print("Merhaba"); // String gönder
serial.print(1234); // Sayı gönder
serial.write('A'); // Tek karakter gönder
if (serial.available()) {
char c = serial.read(); // Veri oku
}
serial.flush(); // TX buffer boşalana kadar bekle
serial.clearBuffer(); // RX buffer temizle
serial.config(7, 'E', 2); // 7-bit data, Even parity, 2 stop bit ayarı- ATmega328P ya da benzeri AVR işlemciler
- 16 MHz sistem frekansı (isteğe göre F_CPU güncellenebilir)
- AVR-GCC veya Atmel Studio ortamı
Serial communication is a common necessity in AVR-based embedded projects, yet it can become unnecessarily complex. I couldn't find a simple, modern C++-compatible library that suited my needs, so I decided to create one from scratch.
My goal is to have a reusable, clean codebase for future use, and to share something helpful with the community.
- Hardware UART via USART0
- Interrupt-based RX
- Polling-based TX
- 64-byte ring buffer for incoming data
- Utility functions:
print,write,read,available,flush,clearBuffer,config
MySerialCom(unsigned long baud)→ Initializes UART communication and sets the baud rate.void write(char data)→ Sends a single character via TX.void print(const char* str)→ Sends a null-terminated string via UART.void print(int num)→ Converts integer to string and sends via UART.char read()→ Reads a character from RX buffer. Returns 0 if no data is available.bool available()→ Checks if RX buffer has available data.void flush()→ Waits until TX buffer is empty.void clearBuffer()→ Clears the RX buffer (resets head and tail).void config(uint8_t dataBits, char parity, uint8_t stopBits)→ Configures UART frame format.dataBits: 5–9,parity: 'N' (None), 'E' (Even), 'O' (Odd);stopBits: 1 or 2.
MySerialCom serial(9600); // Define baud rate
serial.print("Hello"); // Send string
serial.print(1234); // Send number
serial.write('A'); // Send character
if (serial.available()) {
char c = serial.read(); // Read received data
}
serial.flush(); // Wait for TX complete
serial.clearBuffer(); // Clear RX buffer
serial.config(7, 'E', 2); // 7-bit data, Even parity, 2 stop bits- ATmega328P or similar AVR microcontroller
- 16 MHz system clock (adjust F_CPU if needed)
- AVR-GCC or Atmel Studio compatible environment
License: MIT
Author: Mehmet Teker