СХЕМА.RU - Радиолюбительский портал » Другие новости радиолюбителя » Хост Для Usb Hid Термометр, Хост Для Usb Hid Термометр (Linux, C)

Хост Для Usb Hid Термометр, Хост Для Usb Hid Термометр (Linux, C)

19-03-2013, 21:36 От: admin Посмотрели: 925
Возникла проблема с написанием программы (host) USB HID Термометр на языке С для Linux, с использованием библиотеки libusb. Прошивку взял пока готовую с сайта, по аналогии идущей в комплекте программы host'a начал делать сам на С.

Оборудование находится по VID:PID. Cчитываю 8 байт, конвертирую и получаю непонятный результат  который не меняеться (+32,0 С). При просмотре содержимого буфера - оно меняется при каждом опросе. Не могу понять что делаю не так. Может кто в курсе.

Код программы:


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <math.h>
#include <libusb-1.0/libusb.h>
#include <iostream>
using namespace std;
#define DEV_VID 0xaaaa
#define DEV_PID 0xef04
#define DATA_SIZE 8
//#define DEV_CONFIG 1
#define DEV_INTF 0
#define EP_IN 0x81
#define EP_OUT 0x01
int main(int argc, char * argv[])
{
libusb_device_handle * handle;

int ret;
unsigned char buf[DATA_SIZE];

libusb_init(NULL);
libusb_set_debug(NULL, 3);
//получим handle устройства
handle = libusb_open_device_with_vid_pid(NULL, DEV_VID, DEV_PID);
if (handle == NULL) {
printf("Не удалось найти устройство\n");
libusb_exit(NULL);
return 0;
}
if (libusb_kernel_driver_active(handle,DEV_INTF))
libusb_detach_kernel_driver(handle, DEV_INTF);
//захватываем интерфейс
if (libusb_claim_interface(handle, DEV_INTF) < 0)
{
printf("Ошибка интерфейса\n");
libusb_close(handle);
libusb_exit(NULL);
return 0;
}

//считываем данные в буфер
int returned = libusb_interrupt_transfer(handle, EP_IN, buf, DATA_SIZE, &ret, 5000);
if (returned >= 0) {
std::cout << "buf[0] = " << (int)buf[0] << std::endl;
std::cout << "buf[1] = " << (int)buf[1] << std::endl;
std::cout << "buf[2] = " << (int)buf[2] << std::endl;
std::cout << "buf[3] = " << (int)buf[3] << std::endl;
std::cout << "buf[4] = " << (int)buf[4] << std::endl;
std::cout << "buf[5] = " << (int)buf[5] << std::endl;
std::cout << "buf[6] = " << (int)buf[6] << std::endl;
std::cout << "buf[7] = " << (int)buf[7] << std::endl;
}

//вывод содержимого буфера на экран
for (int i = 0; i < DATA_SIZE; i++)
std::cout << buf << std::endl;
//переводим данные в hex
{
printf("Buf: ");
for(unsigned i = 0; i<sizeof(buf); i++){
printf("0x%02x ", buf[i] & 0xff);
}
printf("\n");
}
//конвертируем данные

uint8_t temp_lo = buf[1] & 0xff;
uint8_t temp_hi = buf[0] & 0xff;
int16_t temp = (temp_hi << 8) | (temp_lo);
float temp_f = temp / 16.0; // low 4 bits of temp are fractional part
{
temp_f *= 10;
temp_f = round(temp_f);
temp_f /= 10;
printf("%+.1f\n", temp_f);
}

// отдаем интерфейс и закрыаем библиотеку
libusb_attach_kernel_driver(handle, DEV_INTF);
libusb_close(handle);
libusb_exit(NULL);
return 0;
}

компилирую:


g++ -o usb main.c -lusb-1.0

Раздел: AVR

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления Хост Для Usb Hid Термометр, Хост Для Usb Hid Термометр (Linux, C) все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба

Добавление комментария

Ваше имя:*
E-Mail:*
Текст:
Вопрос:
Решите уравнения x+2x=789
Ответ:*
Введите два слова, показанных на изображении:



Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Календарь новостей
«    Апрель 2024    »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930