条形码扫描仪符号体系的应用

本主题介绍如何使用通用 Windows 平台(UWP)条形码扫描仪 API 来处理条形码符号,而无需手动配置扫描仪。

条形码符号 是将数据映射到特定条形码格式。 一些常见的符号包括 UPC、代码128、QR码等。

确定支持哪些符号体系

由于应用程序可以与来自多个制造商的不同条形码扫描仪模型一起使用,因此可能需要查询扫描程序以确定它支持的符号列表。 如果您的应用需要某种可能不被所有扫描器支持的特定条码制式,或者您需要启用在扫描器上被手动或编程方式禁用的条码制式,此功能将非常有用。

使用 BarcodeScanner.FromIdAsync获取 BarcodeScanner 对象后,调用 GetSupportedSymbologiesAsync 以获取设备支持的符号列表。

以下示例获取条形码扫描仪支持的符号列表,并在文本块中显示它们:

private void DisplaySupportedSymbologies(BarcodeScanner barcodeScanner, TextBlock textBlock) 
{
    var supportedSymbologies = await barcodeScanner.GetSupportedSymbologiesAsync();

    foreach (uint item in supportedSymbologies)
    {
        string symbology = BarcodeSymbologies.GetName(item);
        textBlock.Text += (symbology + "\n");
    }
}

确定是否支持特定符号

若要确定扫描程序是否支持特定符号,可以调用 IsSymbologySupportedAsync

以下示例检查条形码扫描仪是否支持 Code32 符号:

bool symbologySupported = await barcodeScanner.IsSymbologySupportedAsync(BarcodeSymbologies.Code32);

更改识别的符号体系

在某些情况下,你可能想要使用条形码扫描仪支持的符号的子集。 这特别适用于阻止你不打算在应用程序中使用的符号。 例如,为确保用户扫描正确的条形码,可以在获取商品 SKU 时,将扫描限制为 UPC 或 EAN;在获取序列号时,将扫描限制为 Code 128。

知道扫描程序支持的符号后,可以设置要识别的符号。 使用 ClaimScannerAsync建立 ClaimedBarcodeScanner 对象后,即可完成此操作。 可以调用 SetActiveSymbologiesAsync 来启用一个特定的符号集,同时禁用不在列表中的符号。

以下示例将声明的条形码扫描仪的活动符号设置为 Code39Code39Ex

private async void SetSymbologies(ClaimedBarcodeScanner claimedBarcodeScanner) 
{
    var symbologies = new List<uint>{ BarcodeSymbologies.Code39, BarcodeSymbologies.Code39Ex };
    await claimedBarcodeScanner.SetActiveSymbologiesAsync(symbologies);
}

条形码符号属性

不同的条形码符号可以具有不同的属性,例如支持多个解码长度、将检查数字作为原始数据的一部分传输到主机,以及检查数字验证。 使用 BarcodeSymbologyAttributes 类,可以获取和设置给定 ClaimedBarcodeScanner 和条形码符号的这些属性。

可以使用 GetSymbologyAttributesAsync获取给定符号系统的属性。 以下代码片段获取 ClaimedBarcodeScanner的 Upca 符号结构的属性。

BarcodeSymbologyAttributes barcodeSymbologyAttributes = 
    await claimedBarcodeScanner.GetSymbologyAttributesAsync(BarcodeSymbologies.Upca);

完成属性修改并准备好设置它们后,可以调用 SetSymbologyAttributesAsync。 此方法返回一个 bool,仅当属性设置成功时,它为 true

bool success = await claimedBarcodeScanner.SetSymbologyAttributesAsync(
    BarcodeSymbologies.Upca, barcodeSymbologyAttributes);

按数据长度限制扫描数据

某些符号是可变长度,如 Code 39 或 Code 128。 这种符号的条形码可以相互靠近,通常包含特定长度的不同数据。 设置所需数据的特定长度可能会阻止无效扫描。

在设置解码长度之前,请检查条形码符号是否支持多个长度,IsDecodeLengthSupported。 一旦确认支持后,您可以设置 DecodeLengthKind,它是 BarcodeSymbologyDecodeLengthKind类型。 此属性可以是以下任一值:

  • AnyLength:解码任意数字的长度。
  • 离散:解码 DecodeLength1DecodeLength2 单字节字符的解码长度。
  • 范围:解码长度在 DecodeLength1DecodeLength2 之间的单字节字符。 DecodeLength1DecodeLength2 的顺序无关紧要(可以是高于或低于另一种)。

最后,可以设置 DecodeLength1DecodeLength2 的值来控制所需的数据的长度。

以下代码片段演示如何设置解码长度:

private async Task<bool> SetDecodeLength(
    ClaimedBarcodeScanner scanner,
    uint symbology, 
    BarcodeSymbologyDecodeLengthKind kind, 
    uint decodeLength1, 
    uint decodeLength2)
{
    bool success = false;
    BarcodeSymbologyAttributes attributes = await scanner.GetSymbologyAttributesAsync(symbology);

    if (attributes.IsDecodeLengthSupported)
    {
        attributes.DecodeLengthKind = kind;
        attributes.DecodeLength1 = decodeLength1;
        attributes.DecodeLength2 = decodeLength2;
        success = await scanner.SetSymbologyAttributesAsync(symbology, attributes);
    }

    return success;
}

检查数字传输

可以在符号上设置的另一个属性是,检查数字是否会作为原始数据的一部分传输到主机。 在设置此项之前,请确保符号体系支持使用 IsCheckDigitTransmissionSupported进行校验位传输。 然后,设置是否使用 IsCheckDigitTransmissionEnabled启用检查数字传输。

以下代码片段演示如何设置检查数字传输:

private async Task<bool> SetCheckDigitTransmission(ClaimedBarcodeScanner scanner, uint symbology, bool isEnabled)
{
    bool success = false;
    BarcodeSymbologyAttributes attributes = await scanner.GetSymbologyAttributesAsync(symbology);

    if (attributes.IsCheckDigitTransmissionSupported)
    {
        attributes.IsCheckDigitTransmissionEnabled = isEnabled;
        success = await scanner.SetSymbologyAttributesAsync(symbology, attributes);
    }

    return success;
}

检查数字验证

还可以设置是否需要验证条形码的检查数字。 在设置此设置之前,请确保符号系统支持使用 IsCheckDigitValidationSupported进行检查数字验证。 然后,设置是否使用 IsCheckDigitValidationEnabled启用检查数字验证。

以下代码片段演示如何设置检查数字验证:

private async Task<bool> SetCheckDigitValidation(ClaimedBarcodeScanner scanner, uint symbology, bool isEnabled)
{
    bool success = false;
    BarcodeSymbologyAttributes attributes = await scanner.GetSymbologyAttributesAsync(symbology);

    if (attributes.IsCheckDigitValidationSupported)
    {
        attributes.IsCheckDigitValidationEnabled = isEnabled;
        success = await scanner.SetSymbologyAttributesAsync(symbology, attributes);
    }

    return success;
}

支持和反馈

查找问题的答案

有疑问? 在 Docs Q&A 论坛使用 UWP 标签或在 Stack Overflow上使用 pointofservice 标签询问我们。

帮助我们找到你的问题:

  • 请将 pointofservice 标签添加到您在 Stack Overflow 上提出的问题中。
  • 在 Q&A 论坛的帖子中包含 “UWP” 术语

另请参阅