Возникла проблема с написанием программы (host) USB HID Термометр на языке С для Linux, с использованием библиотеки libusb. Прошивку взял пока готовую с сайта, по аналогии идущей в комплекте программы host'a начал делать сам на С.
Оборудование находится по VID:PID. Cчитываю 8 байт, конвертирую и получаю непонятный результат который не меняеться (+32,0 С). При просмотре содержимого буфера - оно меняется при каждом опросе. Не могу понять что делаю не так. Может кто в курсе.
Код программы:
компилирую:
Раздел: AVR
Оборудование находится по 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