USB论坛
直播中

王萍

8年用户 1376经验值
私信 关注
[问答]

使用C++中的CyAPI编写的应用程序上遇到了问题,求解决

我在使用 C++ 中的 CyAPI 编写的应用程序上遇到了问题。
我将 XferData() 方法与其他所有端点类型一起使用,没有遇到任何问题。 但是,将其与 Endpoint0 一起使用会引发错误。 具体来说,越界访问:“读取位置 0xFFFFFFFFFFFFFFFF 时访问冲突”。
如果我使用 Read() 方法,也会出现错误。 代码如下(我省略了获取设备句柄的行):
CCyControlEndPoint* ept = USBDevice->ControlEndPt;
ept->目标 = TGT_DEVICE;
ept->ReqType = REQ_VENDOR;
ept->方向 = DIR_FROM_DEVICE;
ept->ReqCode = 0xC0;
ept->值=1;
ept->索引=1;
UCHAR buff[512];
零内存(buff,512);
长 buflen = 512;
succ = ept->XferData(buff,buflen);

回帖(1)

芒果冰

2025-5-15 17:32:44

在使用CyAPI库处理USB控制端点时,遇到访问冲突错误通常与指针初始化、缓冲区分配或传输参数配置有关。以下是逐步解决方案:


1. 验证指针有效性


确保USBDeviceControlEndPt已正确初始化,并非空指针:


if (!USBDevice || !USBDevice->ControlEndPt) {
    // 处理错误:设备未正确初始化
    return;
}
CCyControlEndPoint* ept = USBDevice->ControlEndPt;

2. 配置控制传输参数


确认控制传输参数与设备固件要求一致:


ept->Target = TGT_DEVICE;      // 目标为设备
ept->ReqType = REQ_VENDOR;     // 厂商请求类型
ept->Direction = DIR_FROM_DEVICE; // 从设备读取数据
ept->ReqCode = 0xC0;          // 设备特定的请求代码
ept->Value = 1;               // 请求参数值
ept->Index = 0;               // 索引值(根据设备要求设置)

3. 分配正确缓冲区


确保缓冲区足够大且已分配,长度不超过设备支持的最大控制传输大小(通常64字节):


LONG length = 64; // 根据设备实际返回数据长度调整
PUCHAR buffer = new (std::nothrow) UCHAR[length];
if (!buffer) {
    // 处理内存分配失败
    return;
}

4. 使用正确的传输方法


对于控制传输,建议使用BeginControlXferWaitForXfer组合:


bool success = ept->BeginControlXfer(ept->Direction, buffer, length);
if (success) {
    if (ept->WaitForXfer(1000)) { // 超时设置为1000毫秒
        ept->FinishControlXfer(buffer, length);
        // 处理数据...
    } else {
        // 超时处理
        ept->Abort();
    }
} else {
    // 启动传输失败
}
delete[] buffer;

5. 检查传输返回值


无论使用XferData还是其他方法,检查返回值:


if (ept->XferData(buffer, length)) {
    // 成功,处理数据
} else {
    // 失败,获取错误信息
    DWORD error = GetLastError();
    // 处理错误...
}

6. 确认设备状态


确保设备已正确连接并处于可处理控制传输的状态(如未处于挂起或错误状态)。


7. 调试与错误处理



  • 使用调试器定位崩溃位置,检查调用栈。

  • 添加日志输出,记录参数配置和缓冲区地址。

  • 验证固件是否正确处理了该控制请求(可能需抓取USB数据包分析)。


示例代码修正


CCyControlEndPoint* ept = USBDevice->ControlEndPt;
if (!ept) {
    // 错误处理
    return;
}

// 配置控制传输参数
ept->Target = TGT_DEVICE;
ept->ReqType = REQ_VENDOR;
ept->Direction = DIR_FROM_DEVICE;
ept->ReqCode = 0xC0;
ept->Value = 1;
ept->Index = 0;

// 分配缓冲区
LONG length = 64;
PUCHAR buffer = new UCHAR[length];
if (!buffer) {
    // 内存分配失败
    return;
}

// 执行控制传输
if (ept->XferData(buffer, length)) {
    // 成功,处理buffer中的数据
} else {
    // 传输失败,处理错误
    DWORD err = GetLastError();
    // 输出错误信息或记录日志
}

delete[] buffer;

可能遗漏的问题



  • 索引值(Index)未设置:检查是否需设置ept->Index,某些请求需要特定索引。

  • 请求方向错误:若实际是主机向设备发送数据,方向应为DIR_TO_DEVICE

  • 请求长度超限:控制传输数据阶段的最大长度通常为64字节,超出可能导致问题。


通过逐步排查以上方面,应能解决访问冲突问题。若问题依旧,建议使用USB协议分析工具(如Wireshark+USBPcap)捕获通信数据,验证请求是否符合设备预期。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分