使用 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
表示读取或写入时出现错误。
可能是超时问题,也可能是连接问题或协议问题。
您需要检查以下可能性:
您的 USB 数据线是否完好,连接器是否正确插入?
可能是物理连接不稳定导致相机丢失
相机协议是什么?
您可能需要在发送命令之间执行某些操作,例如重置接口、通过控制传输在端点 0 上发送一些命令等。
您发送的命令是否正确?
记得认领界面吗?
打开USB连接的代码和发送命令的代码是在同一个线程吗?
在您尝试发送命令时,您的应用程序的其他部分可能正在关闭连接。
您是否为相机 USB 设置了正确的配置?
一些 USB 设备有不止一种配置。
至少,我建议您在问题中添加您使用的相机的确切型号,以便熟悉其协议的人可以为您提供建议。
此外,除非你有相机的协议文档,否则我建议你将它连接到 PC,并使用 WireSHark USB 模块或其他 USB 捕获软件来监控协议并学习如何实现它。
我正在开发一个需要 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
表示读取或写入时出现错误。
可能是超时问题,也可能是连接问题或协议问题。
您需要检查以下可能性:
您的 USB 数据线是否完好,连接器是否正确插入?
可能是物理连接不稳定导致相机丢失相机协议是什么?
您可能需要在发送命令之间执行某些操作,例如重置接口、通过控制传输在端点 0 上发送一些命令等。您发送的命令是否正确?
记得认领界面吗?
打开USB连接的代码和发送命令的代码是在同一个线程吗?
在您尝试发送命令时,您的应用程序的其他部分可能正在关闭连接。您是否为相机 USB 设置了正确的配置? 一些 USB 设备有不止一种配置。
至少,我建议您在问题中添加您使用的相机的确切型号,以便熟悉其协议的人可以为您提供建议。
此外,除非你有相机的协议文档,否则我建议你将它连接到 PC,并使用 WireSHark USB 模块或其他 USB 捕获软件来监控协议并学习如何实现它。