获取并了解条形码数据

本主题介绍了如何在 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 有三个属性:

如需访问 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”一词添加到你的帖子中

另请参阅