Search code examples
c#uwpserial-portbarcodebarcode-scanner

How to read barcodes with a barcode scanner that does not emulate keyboard?


EDIT: Okay, so I've moved on and made a fully working console app:

public static void Main(string[] args)
    {
        SerialPort mySerialPort = new SerialPort("COM4");

        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;
        mySerialPort.RtsEnable = true;

        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        mySerialPort.Open();

        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();
        Console.ReadKey();
        mySerialPort.Close();
    }

    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        Thread.Sleep(100);
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine($"Data Received: {indata}");
        indata = "";
    }

Now the problem is that when I try to do something similar in the UWP app -

public void InitScanner()
       {
            SerialPort mySerialPort = new SerialPort("COM4")
            {
                BaudRate = 9600,
                Parity = Parity.None,
                StopBits = StopBits.One,
                DataBits = 8,
                Handshake = Handshake.None,
                RtsEnable = true
            };

            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

            mySerialPort.Open();

            tBlock_spState.Text = mySerialPort.IsOpen.ToString();

       }

        void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(100);
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            tBlock_test.Text = indata;
        }

        public MainPage()
        {
            this.InitializeComponent();
            InitScanner();
            

        }

It throws an System.IO.IOException with description "Too many posts on a semaphore" (sorry for the translation, I am using VS with Czech language). Does anyone know the reason why is this happening? Once again, can't find anything anywhere.


So, I've got a task to write a code, which could allow to read data from a barcode scanner that does not act like a keyboard and write it to a textbox. My thought was that it could be possible via System.IO.Ports.SerialPort class, but I have absolutely no idea how to make it work as it should. I am working on this in an UWP. I've tried this so far

SerialPort sp = new SerialPort("COM4", 9600);

        void MethodName()
    {
        string s;

        if(!sp.IsOpen)
        sp.Open();

        while (sp.BytesToRead > 0)
        {
            s = sp.ReadLine();
            tBlock_test.Text = s;
        }

        sp.Close();
    } 

And that is where I've ended and don't know what to do next, or even if this is somehow correct. Again, basic question, i know, but i am seriously stuck on this and cannot find solution anywhere. I'd appreciate any kind of help.


Solution

  • I've remade the app in the WPF template and tried the answer from here: SerialPort reading cause error because of not owning thread (Delegate + Invoke method) and it finally worked.