Jump to content
XELFAER

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

Recommended Posts

Возникла проблема с написанием программы (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

Share this post


Link to post
Share on other sites

То есть при выводе буфера на экран всё правильно, а после конвертирования данных - неправильно?

Share this post


Link to post
Share on other sites

То есть при выводе буфера на экран всё правильно, а после конвертирования данных - неправильно?

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

Во вложении сделал скрин когда датчик температуры ds18b20 подключен и отключен.

post-160582-0-13931600-1363694403.png

post-160582-0-50235800-1363694408.png

Share this post


Link to post
Share on other sites

Высококачественные конденсаторы Panasonic для надежности вашей электроники!

Электролитические алюминиевые конденсаторы Panasonic отличаются повышенной надежностью, длительным сроком службы, низким импедансом и выдерживают большой ток пульсаций, в то время как семейства полимерных конденсаторов Panasonic SP-CAP, POSCAP, OS-CON и HYBRID характеризуют сверхнизкий ESR и увеличенная емкость, работа при высоких напряжениях и в расширенном температурном диапазоне. Приобретая продукцию Panasonic, вы гарантированно получаете самое передовое решение для ваших задач. Для облегчения вашего выбора, мы подготовили подборку полезных материалов.

Читать статьи

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By admin
      В ролике показано как скомпилировать и установить библиотеку OpenCV 4.1.0 на Raspberry Pi 3.
      Используйте промокод CXEMNET и получите скидку 10% в магазине https://www.seeedstudio.com/ при покупке от 150$!
      https://www.seeedstudio.com/category/Raspberry-pi-c-1010/Raspberry-Pi-3-Model-B--p-3037.html малинка
      https://www.seeedstudio.com/category/Raspberry-pi-c-1010/Raspberry-PI-VGA666-DPI-dtoverlays-Module.html модуль vga666
      https://www.seeedstudio.com/category/Raspberry-pi-c-1010/Raspberry-Pi-Camera-Module-V2-p-2800.html камера
      Команды из видео.
      Открыть настройки raspberry Pi: 
      sudo raspi-config
      Далее выбираем Advanced Options → Expand Filesystem. Перезагружаемся.

      Установка требуемых пакетов:
      sudo apt-get install cmake cmake-curses-gui libgtk2.0-dev
      sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libx264-dev libxvidcore-dev
      sudo apt-get install libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev
      sudo apt-get install gfortran libatlas-base-dev
      Увеличение размера файла подкачки. 
      sudo nano /etc/dphys-swapfile
      Находим строчку CONF_SWAPSIZE=100
      И увеличиваем число например до 1024.
      Перезапускаем службу.
      sudo /etc/init.d/dphys-swapfile stop
      sudo /etc/init.d/dphys-swapfile start
      Создаем папку opencv в домашнем каталоге и переходим в нее
      cd /home/pi
      mkdir opencv
      cd opencv
      Скачиваем архивы с исходниками с помощью утилиты wget
      wget https://github.com/opencv/opencv/archive/4.1.0.zip -O opencv_source.zip
      wget https://github.com/opencv/opencv_contrib/archive/4.1.0.zip -O opencv_contrib.zip
      Распаковываем архивы.
      unzip opencv_source.zip
      unzip opencv_contrib.zip
      И теперь можно их удалить
      rm opencv_source.zip
      rm opencv_contrib.zip
      Теперь переходим в папку opencv-4.1.0 и создаем в ней папку build
      cd opencv-4.1.0
      mkdir build
      cd build
      Настраиваем параметры сборки. Обратите внимание на путь до дополнительных модулей!
      cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D INSTALL_C_EXAMPLES=OFF \
      -D INSTALL_PYTHON_EXAMPLES=ON \
      -D OPENCV_EXTRA_MODULES_PATH=/home/pi/opencv/opencv_contrib-4.1.0/modules \
      -D BUILD_EXAMPLES=ON \
      -D BUILD_DOCS=ON \
      -D ENABLE_NEON=ON ..
      Компиляция в 1 поток
      make -j1

      Компиляция в 4 потока (только если у вас хорошее охлаждение малинки)
      make -j4

      Установка библиотеки
      sudo make install

      Настройка динамического связывания
      sudo ldconfig

      Проверка работоспособности библиотеки.
      python3
      import cv2
      cv2.__version__

      В результате, библиотека должна выдать номер версии, которую вы установили.
    • By admin
      Честный обзор миникомпьютера OMEGA 2. Характеристики, подключение и работа с командной строкой. Отправляем твит и компилируем свое приложение прямо на миникомпьютере.
      Ссылка на миникомпьютер: https://www.indiegogo.com/projects/omega2-5-linux-computer-with-wi-fi-made-for-iot
      Ссылка на документацию: https://docs.onion.io/omega2-docs/
      Ссылка на opkg пакеты: http://repo.onion.io/omega2/
    • By vv7
      Всем привет !
      Да, вот так вот. Опять светодиод и опять не запускается.
      В чём косяк ?
      Питание - от автозарядки для мобилки ( 12В -> 5В ).
      Среда разработки ( IDE ): MPLAB X v3.35 Linux, компилятор C18.
      Программатор: PICKit3
      Прошивка, по-моему - нормальная.
      Сконфигурирован - нормально. ( Или нет ? )
      Элементы все рабочие.
      В наличие есть кварц: 4, 8, 10 МГц.
      Фотка со схемкой - в атаче.
      Осциллографа под рукой - нет .
      Исходник прошивки:

      #include "config_bits.h" #include <stdio.h> #include <stdlib.h> void main (void) { int i = 0; TRISA = 0x00; PORTA = 0x00; TRISB = 0x00; PORTB = 0xFF; TRISC = 0x00; PORTC = 0x00; TRISD = 0x00; PORTD = 0x00; TRISE = 0x00; PORTE = 0x00; while (1) { for ( i = 0; i < 1000000; i++) { PORTB = !PORTB; } } }
      Файл "config_bits.h":

      // PIC18F452 Configuration Bit Settings // 'C' source line config statements #include <p18f452.h> // CONFIG1H #pragma config OSC = HS // Oscillator Selection bits (HS oscillator) #pragma config OSCS = OFF // Oscillator System Clock Switch Enable bit (Oscillator system clock switch option is disabled (main oscillator is source)) // CONFIG2L #pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOR = ON // Brown-out Reset Enable bit (Brown-out Reset enabled) #pragma config BORV = 20 // Brown-out Reset Voltage bits (VBOR set to 2.0V) // CONFIG2H #pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit)) #pragma config WDTPS = 128 // Watchdog Timer Postscale Select bits (1:128) // CONFIG3H #pragma config CCP2MUX = ON // CCP2 Mux bit (CCP2 input/output is multiplexed with RC1) // CONFIG4L #pragma config STVR = ON // Stack Full/Underflow Reset Enable bit (Stack Full/Underflow will cause RESET) #pragma config LVP = OFF // Low Voltage ICSP Enable bit (Low Voltage ICSP disabled) // CONFIG5L #pragma config CP0 = OFF // Code Protection bit (Block 0 (000200-001FFFh) not code protected) #pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh) not code protected) #pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh) not code protected) #pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh) not code protected) // CONFIG5H #pragma config CPB = OFF // Boot Block Code Protection bit (Boot Block (000000-0001FFh) not code protected) #pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code protected) // CONFIG6L #pragma config WRT0 = OFF // Write Protection bit (Block 0 (000200-001FFFh) not write protected) #pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh) not write protected) #pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh) not write protected) #pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh) not write protected) // CONFIG6H #pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write protected) #pragma config WRTB = OFF // Boot Block Write Protection bit (Boot Block (000000-0001FFh) not write protected) #pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write protected) // CONFIG7L #pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000200-001FFFh) not protected from Table Reads executed in other blocks) #pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from Table Reads executed in other blocks) #pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from Table Reads executed in other blocks) #pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from Table Reads executed in other blocks) // CONFIG7H #pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) not protected from Table Reads executed in other blocks)
      Проблема: Он то ли не запускается, то ли ещё что-то. Светодиод на 30 ножке ( PORTBbits.RB0 ( B0 ) ) просто горит. А ведь в программе я прописал, чтоб весь блок B периодически переключался на противоположенное значение, но этого не происходит. Менял значения цикла от 1000000 до 10 - 0 по цельсию.
      Вопрос, что может быть. Может минус плохой и на монтажных схемках такого рода ( как на фотке ) собирать схемы на МК - плохая идея ? Аля нужно паять ?!
      Спасибо !!!



    • By Vascom
      Кто-нибудь использует stlink https://github.com/texane/stlink для работы с МК под Linux?
    • By Bismark
      Доброго времени суток!
      Вот занялся связью AVR с компом по USB и как раз попались мне статьи с использованием HID и соответственно hidlibrary.h.
      Сделал устройство, описанное в статье http://cxem.net/comp/comp129.php, а оно, в свою очередь основывается на http://we.easyelectronics.ru/electro-and-pc/usb-dlya-avr-chast-2-hid-class-na-v-usb.html.
      Прошитый контроллер нормально определяется системой, показывает VID и PID, и даже готовый софт (в первой статье) нормально с ним взаимодействует.
      А вот написать свой софт не выходит...
      Обнаружилось, что функция

      int connect() // этой функцией будем подключаться к устройству { int i, n, res = 0; string exampleDeviceName = ""; exampleDeviceName += vendorName; exampleDeviceName += " "; exampleDeviceName += productName; n = hid.EnumerateHIDDevices(); for (i = 0; i < n; i++){ hid.Connect(i); if ( hid.GetConnectedDeviceName() == exampleDeviceName ){ res = 1; break; } } return res; }
      почему-то не хочет коннектиться.
      Выяснилось, что код

      if ( hid.GetConnectedDeviceName() == exampleDeviceName ){ res = 1; break; }
      нормально не отрабатывает, то есть hid.GetConnectedDeviceName() всегда возвращает пустую строку.
      Проверка подтвердила, что счетчик устройств не равен нулю, а в моем случае находит два устройства - мышку и подключенный контроллер.
      Кто-то сталкивался с такой проблемой? Почему функция не выводит названия устройств?
      Писал софт на С++ Builder 2007.
      Встречал заметки, что на билдер ставили какой-то апдейт, но я так понял что говорили о версии 6 и соответственно update 4. Пробовал установить эту версию (с апдейтом), однако результат компиляции софта был таким же.
      Система - Windows 7 SP1 x64
  • Сообщения

    • Не выдавайте желаемое за действительное. Моё мнение основано на личном опыте прослушивания как живых инструментов так и разного типа акустики, в том числе и широщита, чужих и собственного изготовления. Ну не может диполь по узд нч превзойти фи, чвр, бп и другие фвч более высокого порядка аппроксимации Бесселя/Даттерворта. И афчх широщита  выше 1кгц оставляет желать лучшего. Об этом говорит теория и подтверждает практика. 
    • Снова интересные проблемы вылезли с трекером. Сделал человеку - проверил сам несколько раз и дома и на улицу вышел попробовал - всё ОК. Отдал хозяину - через несколько дней вернул. Неисправность такая - включаю настроенный прибор - реакция на металл есть. Оставляю на балконе включенный прибор - катушку вывешиваю на метр-полтора наружу. Через некоторое время проверяю - чувствительность резко упала и при срабатывании прибора сигнал не прерывается. Для ускорения проверки заменил другую плату в блок, до этого дома работала без проблем, поставил в корпус - проблема повторилась. Пробовал подключать катушку напрямую, питание тоже, менял динамик и подключал другую катушку. Всё повторяется. Может кто сталкивался с подобной проблемой. Плата от DesAlex a, прошивка с сайта.
    • Привет всем, вот, переделал схему усилителя, скидываю, возбуждается на ВЧ, где ставить корректирующие цепочки?  v2012..ms10 v2012..ms10 (Security copy)
    • А как тебя это лимитирует? Добавилось хлопот?
    • Всем привет. Обсуждаемый в этой теме бп, пойдет для питания бесколлекторного мотора? Мотор хочет 48В и 8А.
×
×
  • Create New...