3

我正在尝试使用 LIBUSING 和 C# 通过 USB 与诺基亚 Lumia 手机(RM-917)进行通信。LIBUSB 能够查看设备的信息(pid、vid 等)。但是,我无法成功写入任何端点,甚至无法将确切的命令作为 Windows 设备恢复工具发送。

根据 WinUSB,写入端点是 EP07,然而,这个端点只是超时。我已经尝试了所有其他端点,但所有这些都失败了。

`
public void initDevice()
{


    if(this.lumiaDevice == null)
    {
        throw new Exception("LumiaPhoneManager does not have a selected device");
    }

    UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(0x0421, 0x0661);
    MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);


    IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
    if (!ReferenceEquals(wholeUsbDevice, null))
    {
        // This is a "whole" USB device. Before it can be used, 
        // the desired configuration and interface must be selected.

        // Select config #1
        wholeUsbDevice.SetConfiguration(1);

        // Claim interface #0.
        wholeUsbDevice.ClaimInterface(1);
    }

    if (this.writer == null)
    {
        writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep07);
    }



}


    public void readPCode()

{
    currentID++;
    var _x = new jsonPkt();
    ErrorCode ec = ErrorCode.None;
    int bytesWritten;
    _x.id = this.currentID + 1;
    _x.method = "ReadProductCode";

    string value = @"{""jsonrpc"":""<JSONRPC>"",""id"":<ID>,""method"":""<METHOD>"",""params"":null}";
    value = value.Replace("<JSONRPC>", "2.0");
    value = value.Replace("<ID>", currentID.ToString());
    value = value.Replace("<METHOD>", _x.method.ToString());


ec = writer.Write(Encoding.Default.GetBytes(value), 8000, out bytesWritten);
    currentID++;

    if (ec != ErrorCode.None) throw new Exception(UsbDevice.LastErrorString);

    byte[] readBuffer = new byte[1024];
    while (ec == ErrorCode.None)
    {
        int bytesRead;

        // If the device hasn't sent data in the last 100 milliseconds,
        // a timeout error (ec = IoTimedOut) will occur. 
        ec = reader.Read(readBuffer, 100, out bytesRead);

     //   if (bytesRead == 0) throw new Exception("No more bytes!");

        // Write that output to the console.
        this.rtb.Text += Encoding.Default.GetString(readBuffer, 0, bytesRead).ToString() + "\n";

    }
}
4

2 回答 2

1

找到了解决方案

调试 OEM 软件,发现程序使用了不同的 USB 设备路径。之后,我遇到了拒绝访问错误,这是通过将项目移动到不同的驱动器来解决的。不知什么原因,程序在c盘运行时,CreateFile函数失败,拒绝访问

于 2017-03-31T16:23:04.760 回答
-1

要激活写入,您可能需要先发送一些特定于类的控制请求。你提到windows设备恢复工具是可以写的。您可以在 Windows PC 中安装 USB 数据包嗅探器软件,然后使用设备管理器将一些数据写入设备。数据包嗅探器工具将能够捕获所有发送到设备的数据包。通过这种方式,您可以看到启用写操作所需的确切设备请求。

分析仪软件 - http://www.usblyzer.com/

请尝试这种方式来解决您的问题。

PS-我假设你没有像 Lecroy advisor 或 Beagle 这样的硬件 USB 数据包分析器。软件数据包嗅探器应该没问题,因为主机是 PC。

于 2017-03-29T14:30:52.650 回答