使用 bulktransfer() 传输数据时获取 -1

Getting -1 while data transfer using bulktransfer()

我正在开发一个需要 Android phone 和相机之间的数据通信的应用程序。 Android phone 和相机通过 USB 连接。

我第一次可以用bulkTransfer()读写数据,但是当我第二次尝试时,我得到负数1。 我也尝试过不同的超时。非常感谢任何类型的建议。

我的代码如下

public int process()
{
    // prepare the command data
    ContainerCommand data = prepareCommand();

    int reqSize = data.size();
    data.prepareRequest(outBuffer);

    if (! skipLogging) {
        Log.i(TAG, "-== Ready to send Command [**- " + commandName + " -**] ==-");
        if (OperationCode.debugVerbose) {
            Log.v(TAG, data.toString());
            Log.v(TAG, StringUtility.dumpByteArray(outBuffer, reqSize));
        }
        Log.d(TAG, "reqLen: " + reqSize);
    }

    int sentLen;
    sentLen = usbConnection.bulkTransfer(epHost2Camera, outBuffer, reqSize, usbTimeout);
    if (sentLen != reqSize) {
        if (! skipLogging) {
            Log.w(TAG, "******--- UNEXPECTED send len:" + sentLen);
        }
        return UsbCameraConstants.RET_GENERAL_ERROR;
    }

    int resultCode;
    resultCode = sendExtraData4Command();
    if (resultCode != UsbCameraConstants.RET_SUCCESSFULLY_DONE) {
        if (! skipLogging) {
            Log.w(TAG, "******--- UNEXPECTED extra data send for command! retCode:" 
                    +  short2Hex(resultCode) );
        }
        return resultCode;          
    }

    resultCode = UsbCameraConstants.RET_GENERAL_ERROR;
    // get response
    int readLen;
    boolean responseGet = false;
    boolean errorFound = false;

    readLen = usbConnection.bulkTransfer(epCamera2Host, inBuffer
            , maxInPacketSize, usbTimeout);
    if (! skipLogging) {
        Log.d(TAG, "******--- Got first response, read len:" + readLen);
    }
    if (readLen <= 0) {
        if (! skipLogging) {
            Log.w(TAG, "******--- UNEXPECTED read len:" + readLen);
        }
        errorFound = true;  
    }
    while ((readLen > 0) && (! responseGet) && (! errorFound)) {
        ContainerBase container = null;
        try {
            container = ContainerBase.parseBaseValue(inBuffer, 0, readLen);
        } catch (Exception e) {
            Log.e(TAG, "Failed to parse container packet!", e);
            errorFound = true;
            resultCode = UsbCameraConstants.RET_GENERAL_ERROR;
        }
        if (container != null) {
            if (! skipLogging) {
                Log.d(TAG, "Response packet basic information:" + container.toString());
                if (OperationCode.debugVerbose) { 
                    Log.v(TAG, StringUtility.dumpByteArray(inBuffer, readLen));
                }
            }
            if (container.type == ContainerBase.TYPE_DATA_BLOCK) {
                // need read again
                if (! skipLogging) {
                    Log.d(TAG, "Data container block found!");
                }
                if (readLen > leastPacketSize) {
                    // need process the data content
                    if (! processDataBlock(container.length, readLen) ) {
                        Log.w(TAG, "Failed to Process Data Packet!");
                        errorFound = true;
                    }
                }
            }
            else if (container.type == ContainerBase.TYPE_RESPONSE_BLOCK) {
                resultCode = container.code;
                if (! skipLogging) {
                    Log.d(TAG, "Response container block found! retCode:" + short2Hex(resultCode));
                }
                responseGet = true;
                if (! processResponseBlock() ) {
                    Log.w(TAG, "Failed to Process Response Packet!");
                }
            }
            if (! responseGet) {
                do {
                    readLen = usbConnection.bulkTransfer(epCamera2Host, inBuffer
                            , maxInPacketSize, usbTimeout);
                    if (! skipLogging) {
                        Log.d(TAG, "******--- Got packet from endpoint Camera2Host, read len:" 
                                    + readLen);
                    }
                    if (readLen == 0) {
                        Log.w(TAG, "***ReadLen=0, camera data not ready yet. sleep a little while!");
                        try {
                            Thread.sleep(50L); // 50 milliseconds
                        }
                        catch (Exception e) {
                            // do nothing
                            e.printStackTrace();
                        }
                    }                       
                } while (readLen == 0);

            }
        }


    }

    return resultCode;
} 

很遗憾,您所提供的信息无法解决您的问题。

我写这篇文章是作为一个答案而不是评论,因为我希望有空间向您展示一些可能导致您出现问题的可能性。

-1 return from bulkTransfer 表示读取或写入时出现错误。

可能是超时问题,也可能是连接问题或协议问题。

您需要检查以下可能性:

  1. 您的 USB 数据线是否完好,连接器是否正确插入?
    可能是物理连接不稳定导致相机丢失

  2. 相机协议是什么?
    您可能需要在发送命令之间执行某些操作,例如重置接口、通过控制传输在端点 0 上发送一些命令等。

  3. 您发送的命令是否正确?

  4. 记得认领界面吗?

  5. 打开USB连接的代码和发送命令的代码是在同一个线程吗?
    在您尝试发送命令时,您的应用程序的其他部分可能正在关闭连接。

  6. 您是否为相机 USB 设置了正确的配置? 一些 USB 设备有不止一种配置。

至少,我建议您在问题中添加您使用的相机的确切型号,以便熟悉其协议的人可以为您提供建议。

此外,除非你有相机的协议文档,否则我建议你将它连接到 PC,并使用 WireSHark USB 模块或其他 USB 捕获软件来监控协议并学习如何实现它。