2015-02-12 3 views
2

Я занимаюсь разработкой об ультразвуковом зонде на стороне Linux. Я хочу захватить необработанные данные с ультразвукового зонда. Я программирую с помощью C и используя libusb API.Получение необработанных данных с помощью libusb

В устройстве имеются две конечные точки BULK IN (2 и 6). Устройство отправляет 2048 байт данных, но отправляет данные в виде 512 байт с четырьмя блоками.

Enter image description here

Эта картина потока данных на стороне Windows, и я хочу, чтобы скопировать, что в сторону Linux. Вы видите четыре блока данных с конечной точкой 02 и после этого четыре блока данных с конечной точкой 06.

Но есть проблема с выбором времени. Первый блок данных конечной точки 02 и первый блок данных конечной точки 06 находятся близко друг к другу по времени. Но в потоке данных они не находятся в последовательности.

Я вижу, что компьютер считывает первые блоки данных конечной точки 02 и 06. После этого компьютер считывает три других блока данных конечной точки 02 и конечной точки 06. Но в USB-анализаторе поток данных просматривается в соответствии с номером конечной точки. Последовательность отличается по времени.

На стороне 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

Кстати, есть более эффективные способы задержать ваши петли: человек 3 nanosleep – asamarin

+1

на самом деле сон() или nanosleep() - лучший вариант задержки; цикл, который ничего не выполняет, может быть оптимизирован компилятором – Pandrei

+1

, попробуйте добавить nanosleep() для задержки и посмотреть, решит ли это вашу проблему. возможно, вы читаете быстрее, чем доступны данные. – Pandrei

ответ

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); 
} 
Смежные вопросы