Получение необработанных данных с помощью libusb

Я занимаюсь реверс-инжинирингом ультразвукового датчика на стороне 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, и они начинают читать данные в соответствии со временем. Как это возможно?


person bzkrtmurat    schedule 12.02.2015    source источник
comment
Кстати, есть лучшие способы задержать циклы: man 3 nanosleep   -  person asamarin    schedule 12.02.2015
comment
на самом деле sleep() или nanosleep() - лучший вариант для задержки; цикл for, ничего не выполняющий, может быть оптимизирован компилятором   -  person Pandrei    schedule 12.02.2015
comment
попробуйте добавить nanosleep() для задержки и посмотрите, решит ли это вашу проблему. возможно, вы читаете быстрее, чем доступны данные   -  person Pandrei    schedule 12.02.2015
comment
Я попробую это. На самом деле моя проблема заключается в том, что первая группа данных из 6 конечных точек получает перед группой данных из 2 конечных точек, но, как вы можете видеть в группе данных потока данных из 6 конечных точек, ниже группы данных из 2 конечных точек в списке данных @Pandrei Примечание. Первое изображение — это поток данных на стороне Windows, второе изображение — это поток данных на стороне Linux, который я делаю.   -  person bzkrtmurat    schedule 12.02.2015
comment
@Pandrei Я сделал это. Я сейчас использую наносон. Но это не решение моей проблемы   -  person bzkrtmurat    schedule 13.02.2015
comment
хорошо... в чем проблема? Я прочитал исходный вопрос примерно 3 раза и до сих пор не могу понять, что не так   -  person Pandrei    schedule 13.02.2015
comment
Я отредактировал свой вопрос. Надеюсь понятно :( @Pandrei   -  person bzkrtmurat    schedule 13.02.2015
comment
Я еще не решил свой вопрос.   -  person bzkrtmurat    schedule 16.02.2015


Ответы (1)


Мне не ясно, используете ли вы другой метод для получения данных в 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);
}
person Jaciq    schedule 17.02.2015