如何使用不模拟键盘的条码扫描仪读取条码?

Posted

技术标签:

【中文标题】如何使用不模拟键盘的条码扫描仪读取条码?【英文标题】:How to read barcodes with a barcode scanner that does not emulate keyboard? 【发布时间】:2022-01-16 20:06:40 【问题描述】:

编辑:好的,所以我继续前进并制作了一个完全正常工作的控制台应用程序:

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 = "";
    

现在的问题是,当我尝试在 UWP 应用中做类似的事情时 -

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();
            

        

它抛出一个 System.IO.IOException,描述为“信号量上的帖子太多”(抱歉翻译,我使用的是捷克语的 VS)。有谁知道发生这种情况的原因?再一次,在任何地方都找不到任何东西。


所以,我的任务是编写代码,它可以允许从不像键盘的条形码扫描仪读取数据并将其写入文本框。我的想法是可以通过 System.IO.Ports.SerialPort 类来实现,但我完全不知道如何让它正常工作。我正在 UWP 中处理这个问题。到目前为止我已经尝试过了

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();
     

这就是我结束的地方,不知道下一步该做什么,或者即使这在某种程度上是正确的。再次,基本问题,我知道,但我严重坚持这一点,无法在任何地方找到解决方案。我将不胜感激。

【问题讨论】:

只有您知道条码扫描仪的确切型号,您必须查找有关它的数据表以了解它如何发送数据(以及它何时发送数据)。仅供参考:您可能希望在 SerialPort 上使用 DataReceived 事件,这样您就不必每 x 秒手动轮询一次 是否可以作为先决条件从条码扫描器接收数据?如果您还没有这样做,请参阅此示例代码。 Windows-universal-samples/Samples/CustomSerialDeviceAccess/cs/ 为什么不使用camera barcode scanner? @Nico Zhu 因为我的任务是让这项工作为人们服务,而不是为相机扫描仪服务。这是我老板的事,不是我的 请不要在您的标题中添加 SOLVED。人们会看看是否有(接受的)答案。 【参考方案1】:

我已经在 WPF 模板中重新制作了该应用程序,并从这里尝试了答案:SerialPort reading cause error because of not owning thread(Delegate + Invoke 方法),它终于奏效了。

【讨论】:

以上是关于如何使用不模拟键盘的条码扫描仪读取条码?的主要内容,如果未能解决你的问题,请参考以下文章

条码扫描枪输入为啥不能用键盘输入代替

条码扫描枪与键盘不能共同使用

Unity UWP 蓝牙条码扫描器

如何将键功能 CTRL-B 模拟为条码

如何在ipod中使用前置摄像头进行条码扫描

如何在 android zxing 中扫描带有嵌入权重的条码