C# İle Donanım Tabanlı Barkod Okuma Uygulaması Nasıl Yapılır?

C# İle Donanım Tabanlı Barkod Okuma Uygulaması Nasıl Yapılır?
C# İle Donanım Tabanlı Barkod Okuma Uygulaması Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Donanım tabanlı bir barkod okuma sistemi kurmak için belirli araçlara ve donanımsal yapılandırmalara ihtiyacınız vardır. Öncelikle geliştirme ortamınızın güncel olduğundan emin olun.

  • Visual Studio 2022 veya üzeri: .NET 9 SDK yüklü olmalıdır.
  • Barkod Okuyucu: USB üzerinden bağlanan herhangi bir HID (Human Interface Device) uyumlu okuyucu.
  • Windows Form veya WPF Projesi: Kullanıcı arayüzü için tercih edilen platform.
  • Temel C# Bilgisi: Event (olay) yönetimi ve form kontrolleri hakkında bilgi.

Barkod okuyucunuzun "USB HID" modunda olduğundan emin olun. Bu mod, cihazın ekstra bir sürücüye ihtiyaç duymadan işletim sistemi tarafından tanınmasını sağlar.

Barkod Okuma Yöntemlerinin Karşılaştırılması

Barkod okuma süreçlerinde kullanılan yöntemlerin avantajlarını ve dezavantajlarını anlamak, doğru mimariyi seçmenize yardımcı olur.

Yöntem Avantajı Dezavantajı
Klavye Emülasyonu Hızlı kurulum, sürücü gerektirmez. Focus (odak) sorunu yaşatabilir.
Serial Port (RS232/USB) Tam kontrol, arka plan işleme. Karmaşık yapılandırma, sürücü ihtiyacı.
Kamera Tabanlı (ZXing) Ek donanım gerektirmez. Düşük performans, yavaş okuma.

Adım Adım Klavye Emülasyonu ile Veri Yakalama

Klavye emülasyonu modundaki cihazlar, veriyi gönderdikten sonra genellikle bir "Enter" tuşu gönderir. Bu, verinin bittiğini anlamamız için en önemli işarettir. Aşağıdaki kod, bir TextBox nesnesine odaklanarak gelen veriyi yakalar.


// Form üzerindeki bir TextBox'ın KeyDown olayı
private void txtBarkod_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        string barkodVerisi = txtBarkod.Text;
        BarkodIsle(barkodVerisi);
        txtBarkod.Clear();
        e.Handled = true; // Enter tuşunun bip sesini engeller
    }
}

Yukarıdaki kod, kullanıcı barkodu okuttuğunda tetiklenir. e.Handled = true ifadesi, formun varsayılan "Enter" davranışını durdurarak uygulamanın kilitlenmesini engeller.

Global Kanca (Global Hook) ile Arka Planda Okuma

Eğer uygulamanızın herhangi bir yerinde barkod okutulmasını istiyorsanız, "Global Hook" yöntemini kullanmalısınız. Bu yöntem, uygulama odakta olmasa bile veriyi yakalamanızı sağlar. Ancak bu yöntem, sistem kaynaklarını daha fazla tüketebilir.


// Basit bir yakalayıcı sınıf yapısı
public class BarkodDinleyici
{
    public event Action BarkodOkundu;
    private StringBuilder _buffer = new StringBuilder();

    public void VeriGirisiniIsle(char karakter)
    {
        if (karakter == '\r') // Enter tuşu
        {
            BarkodOkundu?.Invoke(_buffer.ToString());
            _buffer.Clear();
        }
        else
        {
            _buffer.Append(karakter);
        }
    }
}

Bu sınıf, gelen karakterleri bir tampon (buffer) üzerinde toplar ve "Enter" karakterini gördüğü anda ana uygulamaya bir olay (event) fırlatır.

Veri Güvenliği ve Doğrulama

Barkod okuyucudan gelen verinin güvenliği, uygulamanızın genel güvenliği için kritiktir. Özellikle SQL Injection saldırılarına karşı gelen veriyi mutlaka temizlemelisiniz.

Kritik Güvenlik Uyarısı: Barkod okuyucudan gelen veriyi asla doğrudan SQL sorgularına parametresiz olarak eklemeyin. Her zaman "Parameterized Query" (Parametreli Sorgu) yapısını kullanın.


public void BarkodIsle(string barkod)
{
    // Güvenli veritabanı sorgusu örneği
    string query = "SELECT UrunAdi, Fiyat FROM Urunler WHERE BarkodNo = @Barkod";
    using (var cmd = new SqlCommand(query, connection))
    {
        cmd.Parameters.AddWithValue("@Barkod", barkod.Trim());
        // Sorgu çalıştırılır...
    }
}

Hata Yönetimi ve Debug İpuçları

Donanım tabanlı uygulamalarda "Barkod okumuyor" şikayetleri genellikle donanım yapılandırmasından kaynaklanır. Uygulamanızda bir loglama mekanizması kurarak gelen verinin ham halini görmelisiniz.


try 
{
    // Barkod işleme mantığı
}
catch (Exception ex)
{
    File.AppendAllText("error_log.txt", $"{DateTime.Now}: {ex.Message}");
    MessageBox.Show("Barkod işlenirken bir hata oluştu.");
}

Hata durumunda verinin içeriğini log dosyasına yazmak, karakter kodlama hatalarını (örneğin Türkçe karakter sorunu) tespit etmenize yardımcı olur.

Sıkça Sorulan Sorular

Barkod okuyucu neden veriyi eksik yazıyor?

Bu genellikle "Inter-character delay" (karakterler arası gecikme) ayarının çok düşük olmasından kaynaklanır. Cihazın kılavuzundan bu süreyi biraz artırmayı deneyin.

Uygulama odaklı değilken barkod okuyabilir miyim?

Evet, bunun için "Low-level Keyboard Hook" kütüphanelerini kullanmanız gerekir. Ancak bu, sistem çapında bir dinleme yaptığı için dikkatli kullanılmalıdır.

Barkod okuyucuyu nasıl test edebilirim?

Cihazı bir Not Defteri (Notepad) dosyasına bağlayın. Eğer okutulan barkod Notepad'e düzgün yazılıyorsa, donanımınız sağlamdır; sorun yazılımsal taraftadır.

QR kodları da bu yöntemle okuyabilir miyim?

Evet, modern 2D barkod okuyucular QR kodlarını da klavye emülasyonu ile metin olarak gönderir. Kodunuzda bir değişiklik yapmanıza gerek kalmaz.

Veritabanı bağlantısı koptuğunda ne yapmalıyım?

Uygulamanızda bir "Offline Mode" (Çevrimdışı Mod) geliştirmeli, verileri yerel bir SQLite dosyasında saklayıp bağlantı geldiğinde senkronize etmelisiniz.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce, veritabanı bağlantı güvenliği, hata yönetimi ve giriş doğrulama süreçlerini projenizin mimarisine uygun şekilde yapılandırınız.

Performans Optimizasyonu ve Asenkron Veri İşleme

Barkod okuyucular, klavye emülasyonu modunda çalıştıklarında veriyi çok hızlı bir şekilde metin kutusuna "basarlar". Eğer bu veri girişi sırasında veritabanı sorgusu veya API isteği gibi ağır işlemler yapıyorsanız, arayüzün donmasına (UI freeze) neden olabilirsiniz. Bu durumu engellemek için Task tabanlı asenkron programlama modelini kullanmak zorunludur.

Aşağıdaki örnek, barkod okuyucudan gelen veriyi arayüzü kilitlemeden işleyen asenkron bir yapıyı göstermektedir:

private async void txtBarcode_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        string barcode = txtBarcode.Text.Trim();
        txtBarcode.Clear();
        
        // Arayüzü dondurmadan arka planda işlem yap
        await ProcessBarcodeAsync(barcode);
    }
}

private async Task ProcessBarcodeAsync(string barcode)
{
    try
    {
        // Veritabanı veya API çağrısı
        var product = await Task.Run(() => _dbService.GetProductByBarcode(barcode));
        
        if (product != null)
        {
            lblStatus.Text = $"Ürün Bulundu: {product.Name}";
        }
        else
        {
            lblStatus.Text = "Ürün bulunamadı!";
        }
    }
    catch (Exception ex)
    {
        LogError(ex.Message);
    }
}

Dağıtım (Deployment) ve Donanım Konfigürasyonu

Uygulamanızı farklı bilgisayarlarda çalıştırırken en büyük zorluk, barkod okuyucunun konfigürasyon farklılıklarıdır. Farklı marka ve modeller, "Enter" karakterini farklı ASCII kodlarıyla gönderebilir veya okuma hızları değişkenlik gösterebilir.

Dağıtım sürecinde şu stratejileri izlemeniz önerilir:

  • Konfigürasyon Dosyası: Okuyucunun gönderdiği "Suffix" (son ek) karakterini App.config veya appsettings.json dosyasında saklayın. Böylece kod değişikliği yapmadan okuyucu ayarlarını güncelleyebilirsiniz.
  • Odak Yönetimi: Uygulamanızın her zaman barkod girişine odaklanmasını sağlamak için Form.Activated olayını kullanarak odaklanmayı zorunlu kılın.
  • Loglama: Donanım kaynaklı hataları takip etmek için NLog veya Serilog gibi kütüphanelerle okuma hatalarını ve boş gelen verileri kaydedin.

Donanım Testi İçin Kontrol Listesi

Kontrol Noktası Açıklama
Karakter Seti Okuyucunun Türkçe karakterleri doğru gönderdiğinden emin olun (Kod sayfası ayarı).
Suffix Ayarı Okuyucu "Enter" (CR/LF) gönderiyor mu? Barkod cihazının kılavuzundan kontrol edin.
Hız Sınırı Çok hızlı okumalarda verinin bölünmemesi için KeyPress yerine KeyDown olayını tercih edin.

Bu yapılandırmalar, uygulamanızın sadece laboratuvar ortamında değil, gerçek bir depo veya mağaza ortamında da kararlı bir şekilde çalışmasını sağlayacaktır. Özellikle Task.Run kullanımı, binlerce ürünün olduğu bir veritabanında uygulamanızın yanıt süresini milisaniyeler seviyesinde tutmanıza yardımcı olur.

Sonuç

C# ile donanım tabanlı barkod okuma uygulaması geliştirmek, doğru yaklaşımla oldukça verimli bir süreçtir. Klavye emülasyonu, başlangıç seviyesinden endüstriyel seviyeye kadar en yaygın ve güvenilir yöntemdir. Bu rehberde öğrendiğiniz "Enter" tuşu yakalama, parametreli sorgu kullanımı ve hata yönetimi tekniklerini kullanarak, profesyonel düzeyde bir barkod sistemine sahip olabilirsiniz.

Bir sonraki adım olarak, okunan barkod verilerini gerçek zamanlı olarak bir web servisine (API) gönderen ve yanıtı anlık olarak ekranda gösteren bir "Asenkron Veri İşleme" yapısı üzerine çalışmanızı öneririm.

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Yaratıcı problem çözme teknikleri üzerine odaklanan bir içerik editörüyüm. Hayatı pratikleştiren tüyolarla okuyucuya zaman kazandırmayı hedefleyen yazılar kurguluyorum.

Yorumlar (0)

Yorum Yaz