我在Linux方面对超声探头进行逆向工程。我想从超声探头中捕获原始数据。我使用C编程并使用libusb API。
设备中有两个BULK IN端点(2和6)。设备正在发送2048字节的数据,但是它发送数据为512字节,带有4个块。
这张图片是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端点,它们根据时间开始读取数据。怎么可能?
答案 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);
}