获取并了解条形码数据
本主题介绍了如何在 BarcodeScannerReport 对象中获取条形码扫描程序中的数据,并了解其格式和内容。
设置条形码扫描仪并扫描条形码后,将引发 DataReceived 事件。 ClaimedBarcodeScanner 应该订阅此事件。 DataReceived 事件传递 BarcodeScannerDataReceivedEventArgs 对象,该对象可用于访问条形码数据。
订阅 DataReceived 事件
拥有 ClaimedBarcodeScanner 后,使用它来订阅 DataReceived 事件:
claimedBarcodeScanner.DataReceived += ClaimedBarcodeScanner_DataReceived;
系统将向事件处理程序传递 ClaimedBarcodeScanner 和 BarcodeScannerDataReceivedEventArgs 对象。 你可以通过此对象的 Report 属性访问条形码数据,该属性的类型为 BarcodeScannerReport。
private async void ClaimedBarcodeScanner_DataReceived(ClaimedBarcodeScanner sender, BarcodeScannerDataReceivedEventArgs args)
{
// Parse the data
}
获取数据
获得 BarcodeScannerReport 后,就可以访问和分析条形码数据。 BarcodeScannerReport 有三个属性:
- ScanData:完整的原始条形码数据。
- ScanDataLabel:解码后的条形码标签,不包括标头、校验和以及其他杂项信息。
- ScanDataType:解码后的条形码标签类型。 可能的值在 BarcodeSymbologies 类中定义。
如需访问 ScanDataLabel 或 ScanDataType,必须先将 IsDecodeDataEnabled 设置为 true。
claimedBarcodeScanner.IsDecodeDataEnabled = true;
获取扫描数据类型
获取解码后的条形码标签类型相当简单 - 只需对 ScanDataType 调用 GetName。
private string GetSymbology(BarcodeScannerDataReceivedEventArgs args)
{
return BarcodeSymbologies.GetName(args.Report.ScanDataType);
}
获取扫描数据标签
若要获取解码后的条形码标签,必须注意一些事项。 只有某些数据类型包含编码文本,因此应首先检查符号能否转换为字符串,然后将从 ScanDataLabel 获取的缓冲区转换为编码的 UTF-8 字符串。
private string GetDataLabel(BarcodeScannerDataReceivedEventArgs args)
{
uint scanDataType = args.Report.ScanDataType;
// Only certain data types contain encoded text.
// To keep this simple, we'll just decode a few of them.
if (args.Report.ScanDataLabel == null)
{
return "No data";
}
// This is not an exhaustive list of symbologies that can be converted to a string.
else if (scanDataType == BarcodeSymbologies.Upca ||
scanDataType == BarcodeSymbologies.UpcaAdd2 ||
scanDataType == BarcodeSymbologies.UpcaAdd5 ||
scanDataType == BarcodeSymbologies.Upce ||
scanDataType == BarcodeSymbologies.UpceAdd2 ||
scanDataType == BarcodeSymbologies.UpceAdd5 ||
scanDataType == BarcodeSymbologies.Ean8 ||
scanDataType == BarcodeSymbologies.TfStd)
{
// The UPC, EAN8, and 2 of 5 families encode the digits 0..9
// which are then sent to the app in a UTF8 string (like "01234").
return CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, args.Report.ScanDataLabel);
}
// Some other symbologies (typically 2-D symbologies) contain binary data that
// should not be converted to text.
else
{
return "Decoded data unavailable.";
}
}
获取原始扫描数据
若要从条形码中获取完整的原始数据,只需将从 ScanData 获取的缓冲区转换为字符串。
private string GetRawData(BarcodeScannerDataReceivedEventArgs args)
{
// Get the full, raw barcode data.
if (args.Report.ScanData == null)
{
return "No data";
}
// Just to show that we have the raw data, we'll print the value of the bytes.
else
{
return CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, args.Report.ScanData);
}
}
此数据通常采用扫描程序传送的格式。 但是,系统会删除消息标头和尾部信息,因为它们包含的信息对应用程序毫无用处,并且可能特定于扫描仪。
常见的标头信息是前缀字符(例如 STX 字符)。 常见的尾部信息是终止符(例如 ETX 或 CR 字符)和块校验字符(如果扫描仪生成了该字符)。
如果扫描仪返回符号字符(例如,UPC-A 的 A),则该属性应包含符号字符。 如果标签中有扫描仪返回的校验位,它还应该包括校验位。 (请注意,符号字符和校验数位可能存在也可能不存在,具体取决于扫描程序配置。如果存在,扫描程序将返回,但如果不存在,则不会生成或计算
某些商品可能标有补充条形码。 此条形码通常位于主条形码的右侧,由另外两个或五个字符的信息组成。 如果扫描仪读取的商品同时包含主条形码和补充条形码,则会向主字符追加补充字符,并将结果作为一个标签传递到应用程序。 (请注意,扫描仪可能支持启用或禁用补充代码读取的配置。)
某些商品可能标有多个标签,有时称为多符号标签或分层标签。 这些条形码通常垂直排列,并且可能采用相同或不同的符号。 如果扫描仪读取的商品包含多个标签,则每个条形码都会作为单独的标签传递给应用程序。 这是必需的,因为这些条形码类型目前尚未标准化。 任何应用程序都无法根据单个条形码数据确定所有变体。 因此,应用程序需要根据返回的数据确定何时读取了多标签条形码。 (请注意,扫描仪可能支持也可能不支持读取多个标签。)
此值在向应用程序引发 DataReceived 事件之前设置。
支持和反馈
查找问题的答案
有问题? 请在文档问答论坛上使用 UWP 标记或在 Stack Overflow 上使用 pointofservice 标记向我们提问。
帮助我们找到你的问题:
- 在 Stack Overflow 上,将 pointofservice 标记添加到你的问题中。
- 在问答论坛上,将“UWP”一词添加到你的帖子中