XELFAER

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

3 posts in this topic

XELFAER    1

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

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

Share this post


Link to post
Share on other sites
XELFAER    1

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

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

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

post-160582-0-13931600-1363694403.png

post-160582-0-50235800-1363694408.png

Share this post


Link to post
Share on other sites

Старт складской программы по Wi-Fi/ Bluetooth-чипам от Espressif

На склад КОМПЭЛ поступили чипы, модули и отладочные платы от компании Espressif Systems на базе ESP8266 и ESP32. Стоимость всех изделий данной линейки – в 2-3 раза ниже ближайших аналогов, чипы занимают минимальное место на плате, энергоэффективны и универсальны в применении

Подробнее...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • 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