如何使用不模拟键盘的条码扫描仪读取条码?
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 方法),它终于奏效了。
【讨论】:
以上是关于如何使用不模拟键盘的条码扫描仪读取条码?的主要内容,如果未能解决你的问题,请参考以下文章