1

我在使用摩托罗拉的条码扫描仪 MT2070 时遇到问题。我使用 EMDK 2.6 for .NET(更新 2)从扫描的条形码创建字符串,然后将它们传输到主机 pc。但是传送失败了。

MT2070 运行 Windows CE5.0 并通过蓝牙连接到底座 STB2078。但是每次我得到“发送失败”并且结果代码是“E_INCORRECT_MODE”。

问题是不明白它们对“INCORRECT_MODE”的含义我将它设置为 DECODE 和 RawData 是什么意思与源?

        ScannerServicesClient scannerServices;
        scannerServices = new ScannerServicesClient();
        SCANNERSVC_MODE mode;

        if(scannerServices.Connect(true))
        {
            Logger("start service with decode rights"); // primitiv method to see what happen

            scannerServices.GetMode(out mode);

            if (mode != SCANNERSVC_MODE.SVC_MODE_DECODE)
            {
                mode = SCANNERSVC_MODE.SVC_MODE_DECODE;
                if (scannerServices.SetMode(mode) != RESULTCODE.E_OK)
                {
                    Logger("cant set mode: " + mode.ToString());
                }
            }

            // wanna know which connection is use
            string connection = "";

            switch (scannerServices.HostParameters.CurrentConnection)
            {
                case SCANNERSVC_DATA_CONNECTION.NO_CONNECTION:
                    connection = "Not connected";
                    break;
                case SCANNERSVC_DATA_CONNECTION.BLUETOOTH:
                    connection = scannerServices.HostParameters.BluetoothConnection.ToString();
                    break;
                case SCANNERSVC_DATA_CONNECTION.RS232:
                    connection = scannerServices.HostParameters.RS232Connection.ToString();
                    break;
                case SCANNERSVC_DATA_CONNECTION.USB_CABLE:
                    connection = scannerServices.HostParameters.USBConnection.ToString();
                    break;
            }
            Logger(connection);

            ScannerHostParameters scnHost = new ScannerHostParameters(scannerServices);



            //example hello
            string input = "hello";                     //what should send
            byte[] output = new byte[input.Length];     //field with converted data
            byte source = 0;    //<-- what mean source? i sum all byte-value but this cant be correct

            for (int i = 0; i < input.Length; ++i)
            {
                output[i] = Convert.ToByte(input[i]);
                source += output[i];
            }

            RawData rawData = new RawData(output, input.Length, source);
            //RawParameters rawParam = new RawParameters();

            //rawParam.BaudRate = RawParameters.RawBaudRates.RAWSERIAL_9600;
            //rawParam.Type = RawParameters.RawHostType.Auto;

            RESULTCODE result = scannerServices.SendRawData(rawData, 2000);

            if(result == RESULTCODE.E_OK)
            {
                Logger("successful send");
            }
            else
            {
                Logger("Send failed: " + result.ToString());
            }
            Logger("ScannerService kill");
            scannerServices.Disconnect();
        }
        Logger("\n");
        scannerServices.Dispose();

        scannerServices = null;

谢谢你的帮助!(对不起我的英语)

4

1 回答 1

0

在某些时候(您正在设置模式的某个地方 - 我在设置模式后立即执行此操作)您会想要这样做:

//set raw mode
if (RESULTCODE.E_OK != scannerServices.SetAttributeByte((ushort)ATTRIBUTE_NUMBER.ATT_MIA_HOSTNUM, (byte)ENUM_HOSTS.HOST_RAW))
{
    throw new Exception("Can't set RAW mode");
    scannerServices.Disconnect();
    scannerServices.Dispose();
    return;
}

你在哪里:

RawData rawData = new RawData(output, input.Length, source);

您可以将源保留为 0:

RawData rawData = new RawData(output, input.Length, 0);

不幸的是,我在编程方面并不是最棒的,所以我只是勉强让我的扫描仪工作。文档不是很好,事实上我发现它严重缺乏。甚至摩托罗拉的人似乎也不太了解它或如何对其进行编程。他们至少在某一点上给了我错误的信息。

我对扫描仪使用 CDC COM 端口仿真模式,以便它显示在设备管理器的端口下(我需要扫描仪与我们拥有的使用 COM 端口的旧程序一起工作)。为此还需要一个驱动程序。

根据您使用扫描仪的方式,上述方法可能有效,也可能无效。

于 2013-01-30T20:20:15.170 回答