2

我正在对 Linux 端的超声波探头进行逆向工程。我想从超声波探头捕获原始数据。我正在使用 C 编程并使用 libusb API

设备中有两个 BULK IN 端点(2 和 6)。该设备正在发送 2048 字节的数据,但它以 512 字节的四个块发送数据。

在此处输入图像描述

这张图是Windows端的数据流,我想把它复制到Linux端。您会看到端点 02 的四个数据块,然后是端点 06 的四个数据块。

但是有一个时间问题。端点02的第一个数据块和端点06的第一个数据块在时间上相互接近。但是在数据流中它们不是按顺序排列的。

我看到电脑正在读取端点02和06的第一个数据块。之后,计算机正在读取端点02和端点06的其他三个数据块。但是在USB Analyzer中,数据流是根据端点编号。顺序因时间而异。

在 Linux 端,我编写如下代码:

int index = 0;

imageBuffer2 = (unsigned char *) malloc(2048);
imageBuffer6 = (unsigned char *) malloc(2048);

while (1) {
    libusb_bulk_transfer(devh, BULK_EP_2, imageBuffer2, 2048, &actual2, 0);

    libusb_bulk_transfer(devh, BULK_EP_6, imageBuffer6, 2048, &actual6, 0);

    //Delay
    for(index = 0; index <= 10000000; index ++)
    {

    }
}

所以结果如下图所示

在此处输入图像描述

换句话说,在我的代码中,所有读取数据都是根据时间和端点编号按顺序读取的。我的结果与 Windows 端的数据流不同。

简而言之,我有两个 BULK IN 端点,它们开始根据时间关闭读取数据。这怎么可能?

4

1 回答 1

2

我不清楚您是否使用不同的方法在 Windows 上获取数据,我假设您是。

无论如何,我都不是 libusb 的专家,但我的猜测是你每次调用都会覆盖你的数据,因为你每次都使用相同的缓冲区。在使用传输方法之前尝试给缓冲区一个固定值,然后评估结果。如果是这种情况,我相信以下内容也适用于 C:

imageBuffer2 = (unsigned char *) malloc(2048);
char *imageBuffer2P = imageBuffer2;
imageBuffer6 = (unsigned char *) malloc(2048);
char *imageBuffer6P = imageBuffer6;
int dataRead2 = 0;
int dataRead6 = 0;

while(dataRead2 < 2048 || dataRead6 < 2048)
{
  int actual2 = 0;
  int actual6 = 0;
  libusb_bulk_transfer(devh, BULK_EP_2, imageBuffer2P, 2048-dataRead2, &actual2, 200);
  libusb_bulk_transfer(devh, BULK_EP_6, imageBuffer6P, 2048-dataRead6, &actual6, 200);
  dataRead2 += actual2;
  dataRead6 += actual6;
  imageBuffer2P += actual2;
  imageBuffer6P += actual6;
  usleep(1);
}
于 2015-02-17T16:43:59.660 回答