使用libusb获取原始数据

时间:2015-02-12 09:40:32

标签: c usb libusb libusb-1.0

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

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

Enter image description here

这张图片是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 ++)
    {

    }
}

所以结果如下图所示

Enter image description here

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

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

1 个答案:

答案 0 :(得分: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);
}