Passer au contenu du pied de page
UTILISATION DE IRONBARCODE

Scanner de codes-barres USB C# : Guide complet d’intégration d’IronBarcode

Les lecteurs de codes-barres USB fonctionnent comme des périphériques d'entrée clavier, envoyant automatiquement les données scannées aux applications C#. IronBarcode traite ces données d'entrée pour valider les formats , extraire les données structurées et générer de nouveaux codes-barres , créant ainsi des solutions de numérisation complètes pour les systèmes de gestion des stocks avec une complexité de déploiement minimale.

Les opérations de vente au détail, d'entreposage et de gestion des stocks dépendent d'une lecture efficace des codes-barres. Grâce à IronBarcode et à ses capacités efficaces de validation et de génération , les développeurs peuvent créer des applications de lecture de codes-barres USB fiables qui vont au-delà de la simple capture de données. La bibliothèque valide les données des codes-barres , extrait les informations structurées et génère de nouveaux codes-barres à la volée.

Ce guide explique comment intégrer des lecteurs de codes-barres USB avec IronBarcode en C#. Il en résulte une solution de numérisation en temps réel compatible avec .NET Framework et les applications .NET , permettant aux équipes de gérer efficacement leurs stocks et de suivre les articles. Qu'il s'agisse de concevoir des systèmes de point de vente ou des solutions de gestion des stocks d'entreprise, la compatibilité multiplateforme d'IronBarcode garantit un fonctionnement optimal des applications sous Windows , Linux ou macOS .

Comment les scanners USB de codes-barres fonctionnent-ils avec IronBarcode ?

Pourquoi le mode clavier Wedge est-il important pour l'intégration ?

La plupart des lecteurs de codes-barres USB fonctionnent en mode clavier HID, émulant la saisie au clavier pour une lecture de codes sans effort. Lors de la lecture d'un code-barres, le scanner " saisit " les données, puis appuie sur la touche Entrée. IronBarcode améliore ces données brutes en validant les formats , en extrayant les données structurées et en permettant la génération immédiate de codes-barres en réponse aux scans.

Comprendre les différents modes de communication des scanners est utile pour les applications d'entreprise. Les scanners professionnels prennent en charge la communication série et les modes USB HID directs, au-delà du mode clavier :

// Example: Handling different scanner input modes
public interface IScannerInput
{
    event EventHandler<string> BarcodeScanned;
    void StartListening();
    void StopListening();
}

// Keyboard wedge implementation
public class KeyboardWedgeScanner : IScannerInput
{
    public event EventHandler<string> BarcodeScanned;
    private readonly TextBox _inputBox;

    public KeyboardWedgeScanner(TextBox inputBox)
    {
        _inputBox = inputBox;
        _inputBox.KeyPress += OnKeyPress;
    }

    private void OnKeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.Enter)
        {
            BarcodeScanned?.Invoke(this, _inputBox.Text);
            _inputBox.Clear();
        }
    }

    public void StartListening() => _inputBox.Focus();
    public void StopListening() => _inputBox.Enabled = false;
}

// Serial port implementation for professional scanners
public class SerialPortScanner : IScannerInput
{
    public event EventHandler<string> BarcodeScanned;
    private System.IO.Ports.SerialPort _port;

    public SerialPortScanner(string portName, int baudRate = 9600)
    {
        _port = new System.IO.Ports.SerialPort(portName, baudRate);
        _port.DataReceived += OnDataReceived;
    }

    private void OnDataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        string data = _port.ReadLine().Trim();
        BarcodeScanned?.Invoke(this, data);
    }

    public void StartListening() => _port.Open();
    public void StopListening() => _port.Close();
}
// Example: Handling different scanner input modes
public interface IScannerInput
{
    event EventHandler<string> BarcodeScanned;
    void StartListening();
    void StopListening();
}

// Keyboard wedge implementation
public class KeyboardWedgeScanner : IScannerInput
{
    public event EventHandler<string> BarcodeScanned;
    private readonly TextBox _inputBox;

    public KeyboardWedgeScanner(TextBox inputBox)
    {
        _inputBox = inputBox;
        _inputBox.KeyPress += OnKeyPress;
    }

    private void OnKeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.Enter)
        {
            BarcodeScanned?.Invoke(this, _inputBox.Text);
            _inputBox.Clear();
        }
    }

    public void StartListening() => _inputBox.Focus();
    public void StopListening() => _inputBox.Enabled = false;
}

// Serial port implementation for professional scanners
public class SerialPortScanner : IScannerInput
{
    public event EventHandler<string> BarcodeScanned;
    private System.IO.Ports.SerialPort _port;

    public SerialPortScanner(string portName, int baudRate = 9600)
    {
        _port = new System.IO.Ports.SerialPort(portName, baudRate);
        _port.DataReceived += OnDataReceived;
    }

    private void OnDataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        string data = _port.ReadLine().Trim();
        BarcodeScanned?.Invoke(this, data);
    }

    public void StartListening() => _port.Open();
    public void StopListening() => _port.Close();
}
$vbLabelText   $csharpLabel

Comment les développeurs peuvent-ils capturer et valider les données saisies par un scanner ?

// Capture scanner input and validate with IronBarcode
private async void ProcessScannerInput(string scannedData)
{
    try
    {
        // Validate the scanned data format
        var validationBarcode = BarcodeWriter.CreateBarcode(scannedData, BarcodeEncoding.Code128);
        var results = await BarcodeReader.ReadAsync(validationBarcode.ToBitmap());

        if (results.Any())
        {
            var result = results.First();

            // Extract metadata for enterprise systems
            var scanMetadata = new ScanMetadata
            {
                BarcodeType = result.BarcodeType,
                Value = result.Value,
                Confidence = result.Confidence,
                ScanTimestamp = DateTime.UtcNow,
                ScannerDevice = GetCurrentScannerInfo()
            };

            await ProcessValidBarcode(scanMetadata);
        }
        else
        {
            HandleInvalidScan(scannedData);
        }
    }
    catch (Exception ex)
    {
        LogScanError(ex, scannedData);
    }
}
// Capture scanner input and validate with IronBarcode
private async void ProcessScannerInput(string scannedData)
{
    try
    {
        // Validate the scanned data format
        var validationBarcode = BarcodeWriter.CreateBarcode(scannedData, BarcodeEncoding.Code128);
        var results = await BarcodeReader.ReadAsync(validationBarcode.ToBitmap());

        if (results.Any())
        {
            var result = results.First();

            // Extract metadata for enterprise systems
            var scanMetadata = new ScanMetadata
            {
                BarcodeType = result.BarcodeType,
                Value = result.Value,
                Confidence = result.Confidence,
                ScanTimestamp = DateTime.UtcNow,
                ScannerDevice = GetCurrentScannerInfo()
            };

            await ProcessValidBarcode(scanMetadata);
        }
        else
        {
            HandleInvalidScan(scannedData);
        }
    }
    catch (Exception ex)
    {
        LogScanError(ex, scannedData);
    }
}
$vbLabelText   $csharpLabel

Ce code capture les données du scanner via différentes méthodes et utilise les capacités de lecture asynchrone d'IronBarcode pour valider les données scannées sans bloquer le thread d'interface utilisateur. La fonction de seuil de confiance garantit que seules les numérisations de haute qualité sont traitées dans les environnements de production.

Comment configurer votre projet de scanner de codes-barres ?

Quelles sont les dépendances et configurations essentielles ?

Commencez par créer une application Windows Forms dans Visual Studio pour les scénarios de bureau, ou envisagez Blazor pour les applications de numérisation Web. Pour les solutions d'inventaire mobile, .NET MAUI offre une excellente prise en charge multiplateforme avec des fonctionnalités Android et iOS . Installez ensuite IronBarcode via la console du gestionnaire de packages NuGet :

Install-Package BarCode

Pour les déploiements conteneurisés, IronBarcode fonctionne parfaitement avec Docker , en fournissant des manifestes de déploiement pour les environnements d'entreprise.

Démarrage rapide : Créer une image de code QR en C#

La création d'un code QR génère une représentation visuelle encodant des données dans des carrés scannables :

Nuget IconCommencez dès maintenant à créer des PDF avec NuGet :

  1. Installez IronBarcode avec le gestionnaire de packages NuGet

    PM > Install-Package BarCode

  2. Copiez et exécutez cet extrait de code.

    using IronBarCode;
    
    // Generate QR code from scanned inventory data
    string inventoryCode = "INV-2025-001";
    var qrCode = BarcodeWriter.CreateQrCode(inventoryCode);
    
    // Apply styling for professional labels
    qrCode.ResizeTo(300, 300);
    qrCode.SetMargins(10);
    qrCode.ChangeQrCodeColor(IronSoftware.Drawing.Color.DarkBlue);
    
    // Add logo for branding
    qrCode.AddLogoToQrCode("company_logo.png", 60, 60);
    
    // Save as high-quality image
    qrCode.SaveAsPng("inventory_qr.png");
    
    // Alternative: Save as PDF for printing
    qrCode.SaveAsPdf("inventory_qr.pdf");
  3. Déployez pour tester sur votre environnement de production.

    Commencez à utiliser IronBarcode dans votre projet dès aujourd'hui grâce à un essai gratuit.
    arrow pointer

Quels espaces de noms les applications doivent-elles inclure ?

Ajoutez ces espaces de noms essentiels aux formulaires, ainsi que des exemples tirés de la documentation :

using IronBarCode;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.IO.Ports; // For serial scanners
using System.Diagnostics; // For performance monitoring
using IronBarCode;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.IO.Ports; // For serial scanners
using System.Diagnostics; // For performance monitoring
$vbLabelText   $csharpLabel

Comment les développeurs doivent-ils configurer le formulaire de saisie du scanner ?

Les applications d'entreprise bénéficient de systèmes de configuration de scanner flexibles prenant en charge plusieurs marques de scanners :

public class ScannerConfiguration
{
    public string ScannerType { get; set; } // "KeyboardWedge", "Serial", "USB-HID"
    public string PortName { get; set; } // For serial scanners
    public int BaudRate { get; set; } = 9600;
    public string Terminator { get; set; } = "\r\n";
    public bool EnableBeep { get; set; } = true;

    // Brand-specific settings
    public Dictionary<string, string> BrandSettings { get; set; } = new();

    // Common scanner brand configurations
    public static ScannerConfiguration GetHoneywellConfig()
    {
        return new ScannerConfiguration
        {
            ScannerType = "Serial",
            BaudRate = 115200,
            BrandSettings = new Dictionary<string, string>
            {
                {"Prefix", "STX"},
                {"Suffix", "ETX"},
                {"TriggerMode", "Manual"}
            }
        };
    }

    public static ScannerConfiguration GetSymbolConfig()
    {
        return new ScannerConfiguration
        {
            ScannerType = "KeyboardWedge",
            BrandSettings = new Dictionary<string, string>
            {
                {"ScanMode", "Continuous"},
                {"BeepVolume", "High"}
            }
        };
    }
}
public class ScannerConfiguration
{
    public string ScannerType { get; set; } // "KeyboardWedge", "Serial", "USB-HID"
    public string PortName { get; set; } // For serial scanners
    public int BaudRate { get; set; } = 9600;
    public string Terminator { get; set; } = "\r\n";
    public bool EnableBeep { get; set; } = true;

    // Brand-specific settings
    public Dictionary<string, string> BrandSettings { get; set; } = new();

    // Common scanner brand configurations
    public static ScannerConfiguration GetHoneywellConfig()
    {
        return new ScannerConfiguration
        {
            ScannerType = "Serial",
            BaudRate = 115200,
            BrandSettings = new Dictionary<string, string>
            {
                {"Prefix", "STX"},
                {"Suffix", "ETX"},
                {"TriggerMode", "Manual"}
            }
        };
    }

    public static ScannerConfiguration GetSymbolConfig()
    {
        return new ScannerConfiguration
        {
            ScannerType = "KeyboardWedge",
            BrandSettings = new Dictionary<string, string>
            {
                {"ScanMode", "Continuous"},
                {"BeepVolume", "High"}
            }
        };
    }
}
$vbLabelText   $csharpLabel

Comment valider les codes-barres scannés avec IronBarcode ?

Quelle est la meilleure approche pour la vérification des codes-barres ?

IronBarcode excelle dans la validation et l'analyse des données de codes-barres dans de nombreux formats . La bibliothèque prend en charge les codes-barres 1D tels que Code 128 , EAN-13 et Code 39 , ainsi que les formats 2D , notamment les codes QR et Data Matrix . Voici une approche de validation améliorée :

public class BarcodeValidator
{
    private readonly Dictionary<BarcodeType, Func<string, bool>> _validators;

    public BarcodeValidator()
    {
        _validators = new Dictionary<BarcodeType, Func<string, bool>>
        {
            { BarcodeType.Code128, ValidateCode128 },
            { BarcodeType.EAN13, ValidateEAN13 },
            { BarcodeType.UPCA, ValidateUPCA },
            { BarcodeType.QRCode, ValidateQRCode }
        };
    }

    public async Task<ValidationResult> ValidateScannedBarcodeAsync(string scannedText)
    {
        var result = new ValidationResult();

        try
        {
            // Attempt multiple barcode formats for flexibility
            var encodings = new[] { 
                BarcodeEncoding.Code128, 
                BarcodeEncoding.EAN13,
                BarcodeEncoding.UPCA,
                BarcodeEncoding.QRCode 
            };

            foreach (var encoding in encodings)
            {
                try
                {
                    var barcode = BarcodeWriter.CreateBarcode(scannedText, encoding);
                    var validationResults = await BarcodeReader.ReadAsync(barcode.ToBitmap());

                    if (validationResults.Any())
                    {
                        var validated = validationResults.First();
                        result.IsValid = true;
                        result.Format = validated.BarcodeType;
                        result.Value = validated.Value;
                        result.Confidence = validated.Confidence;

                        // Apply format-specific validation
                        if (_validators.ContainsKey(validated.BarcodeType))
                        {
                            result.PassesBusinessRules = _validators___PROTECTED_LINK_35___;
                        }

                        break;
                    }
                }
                catch { /* Try next format */ }
            }

            // Handle GS1-128 for supply chain applications
            if (!result.IsValid && IsGS1Format(scannedText))
            {
                result = await ValidateGS1BarcodeAsync(scannedText);
            }
        }
        catch (Exception ex)
        {
            result.Error = ex.Message;
        }

        return result;
    }

    private bool ValidateEAN13(string value)
    {
        // EAN-13 checksum validation
        if (value.Length != 13) return false;

        int sum = 0;
        for (int i = 0; i < 12; i++)
        {
            int digit = int.Parse(value[i].ToString());
            sum += (i % 2 == 0) ? digit : digit * 3;
        }

        int checkDigit = (10 - (sum % 10)) % 10;
        return checkDigit == int.Parse(value[12].ToString());
    }
}
public class BarcodeValidator
{
    private readonly Dictionary<BarcodeType, Func<string, bool>> _validators;

    public BarcodeValidator()
    {
        _validators = new Dictionary<BarcodeType, Func<string, bool>>
        {
            { BarcodeType.Code128, ValidateCode128 },
            { BarcodeType.EAN13, ValidateEAN13 },
            { BarcodeType.UPCA, ValidateUPCA },
            { BarcodeType.QRCode, ValidateQRCode }
        };
    }

    public async Task<ValidationResult> ValidateScannedBarcodeAsync(string scannedText)
    {
        var result = new ValidationResult();

        try
        {
            // Attempt multiple barcode formats for flexibility
            var encodings = new[] { 
                BarcodeEncoding.Code128, 
                BarcodeEncoding.EAN13,
                BarcodeEncoding.UPCA,
                BarcodeEncoding.QRCode 
            };

            foreach (var encoding in encodings)
            {
                try
                {
                    var barcode = BarcodeWriter.CreateBarcode(scannedText, encoding);
                    var validationResults = await BarcodeReader.ReadAsync(barcode.ToBitmap());

                    if (validationResults.Any())
                    {
                        var validated = validationResults.First();
                        result.IsValid = true;
                        result.Format = validated.BarcodeType;
                        result.Value = validated.Value;
                        result.Confidence = validated.Confidence;

                        // Apply format-specific validation
                        if (_validators.ContainsKey(validated.BarcodeType))
                        {
                            result.PassesBusinessRules = _validators___PROTECTED_LINK_35___;
                        }

                        break;
                    }
                }
                catch { /* Try next format */ }
            }

            // Handle GS1-128 for supply chain applications
            if (!result.IsValid && IsGS1Format(scannedText))
            {
                result = await ValidateGS1BarcodeAsync(scannedText);
            }
        }
        catch (Exception ex)
        {
            result.Error = ex.Message;
        }

        return result;
    }

    private bool ValidateEAN13(string value)
    {
        // EAN-13 checksum validation
        if (value.Length != 13) return false;

        int sum = 0;
        for (int i = 0; i < 12; i++)
        {
            int digit = int.Parse(value[i].ToString());
            sum += (i % 2 == 0) ? digit : digit * 3;
        }

        int checkDigit = (10 - (sum % 10)) % 10;
        return checkDigit == int.Parse(value[12].ToString());
    }
}
$vbLabelText   $csharpLabel

Pour les documents multipages , IronBarcode peut lire les codes-barres des fichiers PDF et des fichiers TIFF multipages .

Quels formats de codes-barres les applications peuvent-elles valider ?

Cette méthode de validation prend en charge tous les principaux formats de codes-barres 1D et 2D . Pour les applications spécialisées, IronBarcode prend également en charge les codes-barres MSI et les formats GS1-128 couramment utilisés dans la gestion de la chaîne d'approvisionnement.

Comment générer des codes-barres de réponse à partir des entrées scannées ?

Quand les applications doivent-elles créer de nouveaux codes-barres à partir de données de numérisation ?

Transformez les données scannées en nouveaux codes-barres pour l'étiquetage, le suivi ou la gestion des stocks grâce à des fonctionnalités prêtes à l'emploi. Les fonctionnalités de génération d'IronBarcode permettent de créer des codes-barres à partir de différents types de données . Exporter les codes-barres sous forme d'images , de PDF , de HTML ou de flux :

public class InventoryBarcodeGenerator
{
    private readonly string _labelPath = "labels";

    public InventoryBarcodeGenerator()
    {
        // Ensure proper licensing for production use
        IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
        System.IO.Directory.CreateDirectory(_labelPath);
    }

    public async Task<GeneratedBarcode> GenerateInventoryLabelAsync(string productCode, InventoryAction action)
    {
        try
        {
            // Generate structured inventory code
            var inventoryCode = GenerateStructuredCode(productCode, action);

            // Create high-quality barcode with production settings
            var barcode = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.Code128);

            // Apply enterprise styling
            barcode.ResizeTo(400, 120);
            barcode.SetMargins(10);
            barcode.AddAnnotationTextAboveBarcode(inventoryCode, IronSoftware.Drawing.Font.Arial, 12);
            barcode.ChangeBarCodeColor(IronSoftware.Drawing.Color.Black);

            // Add data matrix for redundancy in warehouse environments
            var dataMatrix = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.DataMatrix);
            dataMatrix.ResizeTo(100, 100);

            // Save with error handling
            var timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
            var fileName = $"{inventoryCode}_{timestamp}";

            // Save as multiple formats for flexibility
            await Task.Run(() =>
            {
                barcode.SaveAsPng($"{_labelPath}\\{fileName}.png");
                barcode.SaveAsPdf($"{_labelPath}\\{fileName}.pdf");
                barcode.SaveAsSvg($"{_labelPath}\\{fileName}.svg");
            });

            return new GeneratedBarcode
            {
                Code = inventoryCode,
                LinearBarcodePath = $"{_labelPath}\\{fileName}.png",
                DataMatrixPath = $"{_labelPath}\\{fileName}_dm.png",
                Timestamp = DateTime.UtcNow
            };
        }
        catch (Exception ex)
        {
            throw new BarcodeGenerationException($"Failed to generate barcode for {productCode}", ex);
        }
    }

    private string GenerateStructuredCode(string productCode, InventoryAction action)
    {
        // Implement GS1 Application Identifiers for enterprise compatibility
        var ai = action switch
        {
            InventoryAction.Receive => "10", // Batch/Lot number
            InventoryAction.Ship => "400", // Customer purchase order
            InventoryAction.Count => "37", // Quantity
            _ => "91" // Internal use
        };

        return $"({ai}){DateTime.Now:yyMMdd}{productCode}";
    }
}
public class InventoryBarcodeGenerator
{
    private readonly string _labelPath = "labels";

    public InventoryBarcodeGenerator()
    {
        // Ensure proper licensing for production use
        IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
        System.IO.Directory.CreateDirectory(_labelPath);
    }

    public async Task<GeneratedBarcode> GenerateInventoryLabelAsync(string productCode, InventoryAction action)
    {
        try
        {
            // Generate structured inventory code
            var inventoryCode = GenerateStructuredCode(productCode, action);

            // Create high-quality barcode with production settings
            var barcode = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.Code128);

            // Apply enterprise styling
            barcode.ResizeTo(400, 120);
            barcode.SetMargins(10);
            barcode.AddAnnotationTextAboveBarcode(inventoryCode, IronSoftware.Drawing.Font.Arial, 12);
            barcode.ChangeBarCodeColor(IronSoftware.Drawing.Color.Black);

            // Add data matrix for redundancy in warehouse environments
            var dataMatrix = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.DataMatrix);
            dataMatrix.ResizeTo(100, 100);

            // Save with error handling
            var timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
            var fileName = $"{inventoryCode}_{timestamp}";

            // Save as multiple formats for flexibility
            await Task.Run(() =>
            {
                barcode.SaveAsPng($"{_labelPath}\\{fileName}.png");
                barcode.SaveAsPdf($"{_labelPath}\\{fileName}.pdf");
                barcode.SaveAsSvg($"{_labelPath}\\{fileName}.svg");
            });

            return new GeneratedBarcode
            {
                Code = inventoryCode,
                LinearBarcodePath = $"{_labelPath}\\{fileName}.png",
                DataMatrixPath = $"{_labelPath}\\{fileName}_dm.png",
                Timestamp = DateTime.UtcNow
            };
        }
        catch (Exception ex)
        {
            throw new BarcodeGenerationException($"Failed to generate barcode for {productCode}", ex);
        }
    }

    private string GenerateStructuredCode(string productCode, InventoryAction action)
    {
        // Implement GS1 Application Identifiers for enterprise compatibility
        var ai = action switch
        {
            InventoryAction.Receive => "10", // Batch/Lot number
            InventoryAction.Ship => "400", // Customer purchase order
            InventoryAction.Count => "37", // Quantity
            _ => "91" // Internal use
        };

        return $"({ai}){DateTime.Now:yyMMdd}{productCode}";
    }
}
$vbLabelText   $csharpLabel

Pour des besoins spécifiques, les développeurs peuvent créer des images de codes-barres 1-BPP pour une impression à contraste élevé ou apposer des codes-barres sur des PDF existants .

Quelles sont les options de personnalisation disponibles pour les codes-barres générés ?

IronBarcode offre de nombreuses options de personnalisation, notamment la modification des couleurs , les paramètres de marge et le style des codes QR avec intégration de logo.

![Interface d'application Windows Forms démontrant les capacités de génération de codes-barres doubles d'IronBarcode. L'interface affiche la génération réussie d'un code-barres linéaire Code 128 et d'un code QR pour le numéro d'inventaire 'INV-20250917-helloworld'. Le champ de saisie situé en haut permet aux utilisateurs de saisir des codes d'inventaire personnalisés, avec un bouton " Générer " pour créer les codes-barres. Le message de succès " Article traité avec succès - Étiquettes générées " confirme que l'opération est terminée. Le code-barres Code 128 est désigné comme le format principal de suivi des stocks, tandis que le code QR ci-dessous est présenté comme une alternative adaptée aux appareils mobiles. L'application utilise un fond gris professionnel avec une hiérarchie visuelle claire, démontrant comment IronBarcode permet aux développeurs de créer des systèmes de génération de codes-barres multiformats pour une gestion complète des stocks.

Comment construire une application complète de numérisation de codes-barres ?

À quoi ressemble une implémentation de scanner prête pour la production ?

Voici une implémentation de niveau entreprise avec une gestion complète des erreurs et une optimisation des performances. Cette approche utilise les fonctionnalités de performance et les capacités asynchrones d'IronBarcode pour améliorer le débit :

using IronBarCode;
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace EnterpriseBarcodeScanner
{
    public partial class HighVolumeScanner : Form
    {
        private readonly ConcurrentQueue<ScanData> _scanQueue = new();
        private readonly SemaphoreSlim _processingSemaphore;
        private readonly CancellationTokenSource _cancellationTokenSource = new();
        private IScannerInput _activeScanner;
        private int _maxConcurrentProcessing = Environment.ProcessorCount;

        public HighVolumeScanner()
        {
            InitializeComponent();
            _processingSemaphore = new SemaphoreSlim(_maxConcurrentProcessing);
            InitializeScanner();
            StartProcessingQueue();
        }

        private void InitializeScanner()
        {
            // Auto-detect scanner type
            if (SerialPort.GetPortNames().Any(p => p.Contains("COM")))
            {
                _activeScanner = new SerialPortScanner("COM3", 115200);
            }
            else
            {
                _activeScanner = new KeyboardWedgeScanner(txtScanner);
            }

            _activeScanner.BarcodeScanned += OnBarcodeScanned;
            _activeScanner.StartListening();
        }

        private void OnBarcodeScanned(object sender, string barcode)
        {
            // Queue for async processing to maintain scanner responsiveness
            _scanQueue.Enqueue(new ScanData 
            { 
                RawData = barcode, 
                ScanTime = DateTime.UtcNow 
            });
        }

        private async void StartProcessingQueue()
        {
            while (!_cancellationTokenSource.Token.IsCancellationRequested)
            {
                if (_scanQueue.TryDequeue(out var scanData))
                {
                    await _processingSemaphore.WaitAsync();

                    _ = Task.Run(async () =>
                    {
                        try
                        {
                            await ProcessScanAsync(scanData);
                        }
                        finally
                        {
                            _processingSemaphore.Release();
                        }
                    }, _cancellationTokenSource.Token);
                }
                else
                {
                    await Task.Delay(10); // Prevent CPU spinning
                }
            }
        }

        private async Task ProcessScanAsync(ScanData scanData)
        {
            try
            {
                // Validate with timeout for performance
                using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2));
                var validationTask = ValidateAndProcessBarcodeAsync(scanData.RawData);
                var completedTask = await Task.WhenAny(validationTask, Task.Delay(Timeout.Infinite, cts.Token));

                if (completedTask == validationTask)
                {
                    var result = await validationTask;

                    if (result.Success)
                    {
                        // Update UI thread-safe
                        BeginInvoke(new Action(() =>
                        {
                            AddToInventory(result);
                            GenerateLabelsIfNeeded(result);
                        }));
                    }
                    else
                    {
                        LogScanError(scanData, result.Error);
                    }
                }
                else
                {
                    LogScanTimeout(scanData);
                }
            }
            catch (Exception ex)
            {
                LogCriticalError(ex, scanData);
            }
        }

        private async Task<ProcessingResult> ValidateAndProcessBarcodeAsync(string rawData)
        {
            // Implement smart caching for repeated scans
            if (BarcodeCache.TryGetCached(rawData, out var cachedResult))
            {
                return cachedResult;
            }

            // Use IronBarcode with optimized settings
            var barcodeOptions = new BarcodeReaderOptions
            {
                Speed = ReadingSpeed.Balanced,
                ExpectMultipleBarcodes = false,
                ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode,
                MaxParallelThreads = 1 // Single barcode, no need for parallel
            };

            // Generate and validate
            var testBarcode = BarcodeWriter.CreateBarcode(rawData, BarcodeEncoding.Code128);
            var results = await BarcodeReader.ReadAsync(testBarcode.ToBitmap(), barcodeOptions);

            var result = new ProcessingResult
            {
                Success = results.Any(),
                BarcodeData = results.FirstOrDefault(),
                ProcessingTime = DateTime.UtcNow
            };

            BarcodeCache.Add(rawData, result);
            return result;
        }
    }
}
using IronBarCode;
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace EnterpriseBarcodeScanner
{
    public partial class HighVolumeScanner : Form
    {
        private readonly ConcurrentQueue<ScanData> _scanQueue = new();
        private readonly SemaphoreSlim _processingSemaphore;
        private readonly CancellationTokenSource _cancellationTokenSource = new();
        private IScannerInput _activeScanner;
        private int _maxConcurrentProcessing = Environment.ProcessorCount;

        public HighVolumeScanner()
        {
            InitializeComponent();
            _processingSemaphore = new SemaphoreSlim(_maxConcurrentProcessing);
            InitializeScanner();
            StartProcessingQueue();
        }

        private void InitializeScanner()
        {
            // Auto-detect scanner type
            if (SerialPort.GetPortNames().Any(p => p.Contains("COM")))
            {
                _activeScanner = new SerialPortScanner("COM3", 115200);
            }
            else
            {
                _activeScanner = new KeyboardWedgeScanner(txtScanner);
            }

            _activeScanner.BarcodeScanned += OnBarcodeScanned;
            _activeScanner.StartListening();
        }

        private void OnBarcodeScanned(object sender, string barcode)
        {
            // Queue for async processing to maintain scanner responsiveness
            _scanQueue.Enqueue(new ScanData 
            { 
                RawData = barcode, 
                ScanTime = DateTime.UtcNow 
            });
        }

        private async void StartProcessingQueue()
        {
            while (!_cancellationTokenSource.Token.IsCancellationRequested)
            {
                if (_scanQueue.TryDequeue(out var scanData))
                {
                    await _processingSemaphore.WaitAsync();

                    _ = Task.Run(async () =>
                    {
                        try
                        {
                            await ProcessScanAsync(scanData);
                        }
                        finally
                        {
                            _processingSemaphore.Release();
                        }
                    }, _cancellationTokenSource.Token);
                }
                else
                {
                    await Task.Delay(10); // Prevent CPU spinning
                }
            }
        }

        private async Task ProcessScanAsync(ScanData scanData)
        {
            try
            {
                // Validate with timeout for performance
                using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2));
                var validationTask = ValidateAndProcessBarcodeAsync(scanData.RawData);
                var completedTask = await Task.WhenAny(validationTask, Task.Delay(Timeout.Infinite, cts.Token));

                if (completedTask == validationTask)
                {
                    var result = await validationTask;

                    if (result.Success)
                    {
                        // Update UI thread-safe
                        BeginInvoke(new Action(() =>
                        {
                            AddToInventory(result);
                            GenerateLabelsIfNeeded(result);
                        }));
                    }
                    else
                    {
                        LogScanError(scanData, result.Error);
                    }
                }
                else
                {
                    LogScanTimeout(scanData);
                }
            }
            catch (Exception ex)
            {
                LogCriticalError(ex, scanData);
            }
        }

        private async Task<ProcessingResult> ValidateAndProcessBarcodeAsync(string rawData)
        {
            // Implement smart caching for repeated scans
            if (BarcodeCache.TryGetCached(rawData, out var cachedResult))
            {
                return cachedResult;
            }

            // Use IronBarcode with optimized settings
            var barcodeOptions = new BarcodeReaderOptions
            {
                Speed = ReadingSpeed.Balanced,
                ExpectMultipleBarcodes = false,
                ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode,
                MaxParallelThreads = 1 // Single barcode, no need for parallel
            };

            // Generate and validate
            var testBarcode = BarcodeWriter.CreateBarcode(rawData, BarcodeEncoding.Code128);
            var results = await BarcodeReader.ReadAsync(testBarcode.ToBitmap(), barcodeOptions);

            var result = new ProcessingResult
            {
                Success = results.Any(),
                BarcodeData = results.FirstOrDefault(),
                ProcessingTime = DateTime.UtcNow
            };

            BarcodeCache.Add(rawData, result);
            return result;
        }
    }
}
$vbLabelText   $csharpLabel

Pour améliorer les performances, mettez en œuvre des zones de recadrage afin de concentrer la numérisation sur des zones d'image spécifiques. Les paramètres du lecteur de codes-barres permettent un réglage précis pour différents types de documents.

Comment les équipes peuvent-elles mettre en œuvre des mécanismes de repli ?

Cette application de numérisation pour entreprises met en œuvre plusieurs modèles critiques :

  1. Traitement asynchrone des files d'attente : empêche le blocage de l'interface utilisateur grâce à des opérations asynchrones
  2. Traitement concurrent : Utiliser plusieurs threads pour la validation parallèle
  3. Mise en cache intelligente : réduit le traitement redondant des éléments fréquents
  4. Surveillance des performances : Suit les vitesses de numérisation à l'aide des options de vitesse de lecture
  5. Prise en charge flexible des scanners : Détection automatique du matériel disponible
  • Format invalide : Gérer les exceptions lorsque BarcodeWriter rencontre des données non prises en charge
  • Déconnexion du scanner : implémenter la gestion du focus des zones de texte pour gérer la déconnexion du scanner
  • Validation des données : utilisez les encodages spécifiques au format d'IronBarcode pour garantir la compatibilité des données
  • Échecs de génération : Encapsuler la génération du code-barres dans des blocs try-catch Gestion des délais d'attente : envisagez d'implémenter une temporisation de frappe pour différencier le scanner des entrées clavier.

![Application professionnelle de scanner de codes-barres Windows Forms présentant les capacités de suivi d'inventaire en temps réel d'IronBarcode. L'interface présente un design épuré à deux panneaux avec un en-tête bleu foncé sophistiqué. Le panneau de gauche affiche une liste d'historique de numérisation montrant quatre articles d'inventaire numérisés avec succès (INV-001 à INV-004) avec des horodatages précis et des indicateurs d'état de numérisation. Chaque article comprend des métadonnées détaillées telles que le type de code-barres et le niveau de confiance. Le panneau de droite affiche un code-barres récapitulatif généré dynamiquement indiquant " Articles : 4 " avec un style professionnel et des marges appropriées. Les boutons d'action situés en bas comprennent " Effacer la liste ", " Exporter les données " et " Imprimer les étiquettes " pour une gestion complète des stocks. La barre d'état indique " Scanner : Connecté " | Mode : Continu | Dernière analyse : il y a 2 secondes ", démontrant les capacités de surveillance en temps réel de l'application et sa conception professionnelle adaptée aux entreprises, qu'IronBarcode permet pour les systèmes d'inventaire de production.

Quelles sont les prochaines étapes pour les projets de lecteurs de codes-barres ?

IronBarcode transforme la simple lecture de codes-barres USB en applications de traitement de données intelligentes. En combinant l'entrée du scanner matériel avec les capacités de validation , de génération et de conversion de format d'IronBarcode, les développeurs peuvent créer des solutions de numérisation fiables pour tous les secteurs d'activité. La prise en charge des opérations asynchrones et du multithreading par la bibliothèque garantit que les applications s'adaptent à l'évolution des besoins de l'entreprise.

Pour les déploiements dans le cloud, IronBarcode offre une excellente prise en charge d' AWS Lambda et d'Azure Functions , permettant un traitement des codes-barres sans serveur à grande échelle. La bibliothèque s'intègre parfaitement aux conteneurs Docker pour les architectures de microservices.

Lors de la mise en œuvre de systèmes d'inventaire d'entreprise, tenez compte des modèles architecturaux suivants :

  1. Microservices : Déployer la numérisation en tant que service distinct utilisant IronBarcode sur Docker
  2. Intégration mobile : Extension aux appareils compatibles Android et iOS
  3. Applications Web : Créez une solution de numérisation basée sur navigateur grâce à l'intégration Blazor.
  4. Haute disponibilité : Mettre en œuvre la redondance avec plusieurs options de lecture

Démarrez un essai gratuit pour implémenter dès aujourd'hui la lecture professionnelle de codes-barres dans vos applications C#. Pour des fonctionnalités similaires, explorez IronOCR , qui offre des capacités de reconnaissance de texte complétant les flux de travail de numérisation de codes-barres.

Questions Fréquemment Posées

Qu'est-ce qu'IronBarcode et comment est-il lié aux scanners de codes-barres USB ?

IronBarcode est une bibliothèque qui permet aux développeurs de créer des applications C# robustes pour le scan de codes-barres USB. Elle offre des fonctionnalités telles que la validation de codes-barres, l'extraction de données et la génération de codes-barres.

IronBarcode peut-il valider les données de codes-barres d'un scanner USB ?

Oui, IronBarcode peut valider les données de codes-barres capturées par un scanner USB, garantissant l'intégrité et la précision des données dans vos applications C#.

Comment IronBarcode gère-t-il la génération de codes-barres ?

IronBarcode peut générer de nouveaux codes-barres à la volée, permettant aux développeurs de créer et d'imprimer des codes-barres facilement au sein de leurs applications C#.

Y a-t-il un support de gestion des erreurs dans IronBarcode pour le scan de codes-barres USB ?

Oui, IronBarcode inclut une gestion complète des erreurs pour gérer les problèmes courants qui peuvent survenir durant le scan et le traitement des codes-barres USB.

Quels types de codes-barres peuvent être numérisés avec IronBarcode ?

IronBarcode prend en charge le scan d'une large gamme de symbologies de codes-barres, incluant les QR codes, UPC, Code 39 et plus, le rendant polyvalent pour diverses applications.

IronBarcode peut-il extraire des informations structurées à partir de codes-barres scannés ?

Oui, IronBarcode peut extraire des informations structurées à partir de codes-barres scannés, aidant ainsi le traitement et la gestion efficaces des données.

Comment puis-je commencer à construire une application de scanner de codes-barres USB en C# ?

Pour commencer à construire une application de scanner de codes-barres USB en C#, vous pouvez utiliser IronBarcode ainsi que les exemples de code fournis et la documentation pour guider votre processus de développement.

Jordi Bardia
Ingénieur logiciel
Jordi est le plus compétent en Python, C# et C++, et lorsqu'il ne met pas à profit ses compétences chez Iron Software, il programme des jeux. Partageant les responsabilités des tests de produit, du développement de produit et de la recherche, Jordi apporte une immense valeur à l'amé...
Lire la suite