Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Удалось ли кому-то использовать обертку
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
smk
По ссылке https://github.com/signal11/hidapi/downloads можно скачать библиотечку. Внутри архива есть проект под Visual Studio, но скомпилировать файлик (например консолдьное приложение) не получается. Попытка бороться с сообщениями об ошибке дает новые ошибки. Подскажите как заставить работать пример или может поможет кто сделать новый проект на этой основе? Спасибо.

Нажмите для просмотра прикрепленного файла
Pat
Цитата(smk @ Sep 24 2012, 15:40) *
Подскажите как заставить работать пример или может поможет кто сделать новый проект на этой основе? Спасибо.

Нажмите для просмотра прикрепленного файла


Скачал зпустил, проект собрался вообще без вопросов.
Использовал VS 2008 WinXpSP3 с уже установленным Win DDK.

Сам использовал вот это чудо http://www.pjrc.com/teensy/rawhid.html
Просто и со вкусом, для него нужно установить Win DDK.

Что то мне подсказывает, что и Вашем случае не хватает DDK.
smk
Не могу найти DDK чтоб под 2000 и под ХР тоже. Можно конечно скачать с сайта мелкософта, но там без 2000-ки.
smk
Поставил WDK 7.1, все собралось. Спасибо. Вопрос в том, будет ли программа для общения с HID, изготовленная под ХР работать под 2000?
Pat
Цитата(smk @ Sep 25 2012, 09:58) *
Поставил WDK 7.1, все собралось. Спасибо. Вопрос в том, будет ли программа для общения с HID, изготовленная под ХР работать под 2000?

Должно работать, но надо пробовать.
Если принять во внимание, что Хиду уже сто лет в обед, то врядли там поменяли интерфейс.

Lotor
Цитата(smk @ Sep 25 2012, 11:58) *
Вопрос в том, будет ли программа для общения с HID, изготовленная под ХР работать под 2000?

Смотря какие api функции Вы будете использовать:
w2k не поддерживает HidD_GetInputReport/HidD_SetOutputReport/HidD_GetMsGenreDescriptor
smk
Цитата(Pat @ Sep 24 2012, 16:28) *
Скачал зпустил, проект собрался вообще без вопросов.
Использовал VS 2008 WinXpSP3 с уже установленным Win DDK.

Сам использовал вот это чудо http://www.pjrc.com/teensy/rawhid.html
Просто и со вкусом, для него нужно установить Win DDK.

Что то мне подсказывает, что и Вашем случае не хватает DDK.

А как Вы его используете? Там же под АВРки исходники или я что-то не увидел? Попробовал http://embedded24.net/index.html Получается, но как я понимаю это нужно покупать иначе жди подвоха. В связи с моими симпатиями к VS2010 C# можно узнать кто чем пользуется для работы с USB HID в приложениях Windows Form? Буду благодарен за пример.
andrewlekar
Для C# я перерыл штук 5 библиотек. Остановился на вот этой: https://github.com/mikeobrien/HidLibrary. hidapi тоже используется, но под linux.
smk
Цитата(andrewlekar @ Jan 14 2013, 06:52) *
Для C# я перерыл штук 5 библиотек. Остановился на вот этой: https://github.com/mikeobrien/HidLibrary. hidapi тоже используется, но под linux.

Да, мне тоже он попадался. Но не все решения удается построить. В частности удается построить и запустить GriffinPowerMateWindowsForms, но 21 ошибка (хоть и запускается) пугает. Как у Вас с этим?
andrewlekar
Я все решения и не пытался построить. Погонял TestHarness (если не ошибаюсь), понял, что всё работает как надо, собрал библиотку HidLibrary и перетащил в свой проект.
smk
Цитата(andrewlekar @ Jan 16 2013, 06:50) *
Я все решения и не пытался построить. Погонял TestHarness (если не ошибаюсь), понял, что всё работает как надо, собрал библиотку HidLibrary и перетащил в свой проект.

А можно подробней? Желательно ткнуть носом как обмениваться репортами и какими буферами пользоваться? В целом мне достаточно найти свое устройство и получить указатель на него, открыть его для обращения. Отправить InReport, Feature Report. Запросить OutReport и Feature Report. Буду рад примерам. Спасибо.
andrewlekar
Feature Report я не использую, а примеров хватает в этом самом проекте.
Вот так у меня делается енумерация:

Код
private void RefreshDevices()
        {
            devices.Clear();

            if ((selectedDevice != null) && selectedDevice.IsOpen)
                selectedDevice.CloseDevice();

            foreach (HidDevice dev in HidDevices.Enumerate(0x1FC9, 0x204F))
            {
                MyUsbDevice newDevice = new MyUsbDevice();
                newDevice.device = dev;
                newDevice.hasSerial = false;
                newDevice.serialId = "";

                devices.Add(newDevice);
            }

            foreach (MyUsbDevice dev in devices)
            {
                if (!dev.hasSerial)
                {
                    dev.device.OpenDevice();
                    DeviceReadSerial(dev);
                    dev.device.CloseDevice();
                }
            }

            comboBox1.Items.Clear();
            int index = 0;
            foreach (MyUsbDevice dev in devices)
            {
                if (dev.hasSerial)
                {
                    UsbDeviceInfo inf = new UsbDeviceInfo();
                    inf.index = index;
                    inf.info = "Redut RS-232 #" + dev.serialId;
                    comboBox1.Items.Add(inf);
                }
                
                index++;
            }

            if (comboBox1.Items.Count > 0) comboBox1.SelectedIndex = 0;
        }


Как видно, енумерация непростая: на одном VID/PID могут сидеть несколько девайсов, поэтому дополнительно запрашивается инфа о номере устройства.

Вот примерно так по мнению автора проекта обслуживается устройство:

Код
private void Devices_SelectedIndexChanged(object sender, EventArgs e)
        {
            UsbDeviceInfo item = (UsbDeviceInfo)comboBox1.SelectedItem;

            int index = item.index;

            try
            {
                MyUsbDevice dev = devices[index];
                selectedDevice = dev.device;
                selectedDevice.OpenDevice();

                Output.AppendText(">USB device opened\r\n");

                selectedDevice.MonitorDeviceEvents = true;
                selectedDevice.Inserted += Device_Inserted;
                selectedDevice.Removed += Device_Removed;

                selectedDevice.ReadReport(ReadProcess);
            }
            catch (Exception)
            {
                RefreshDevices();
            }
        }

        private void ReadProcess(HidReport report)
        {
            BeginInvoke(new ReadHandlerDelegate(ReadHandler), new object[] { report });
        }

        private void ReadHandler(HidReport report)
        {
            if(selectedDevice == null)
                return;

            if(!selectedDevice.IsOpen)
                return;

            if(!selectedDevice.IsConnected)
                return;

            //configuration packet
            if (report.Data[0] == 2)
            {
                int length = report.Data[1];

                Output.AppendText("<data: 02 " + length);

                for (int i = 0; i < length; i++)
                {
                    Output.AppendText("" + (char)(report.Data[i + 2]));
                }

                Output.AppendText("\r\n");
            }

            //virtual UART packet
            if (report.Data[0] == 0)
            {
                int length = report.Data[1];

                Output.AppendText("<data: 00 " + length);
                String data = "";

                for (int i = 0; i < length; i++)
                {
                    data += (char)(report.Data[i + 2]);
                }

                Output.AppendText(data);
                Output.AppendText("\r\n");

                if(Linked)
                    serialPort1.Write(report.Data, 2, length);
            }

            //Redut packet
            if (report.Data[0] == 1)
            {
                int length = report.Data[1];

                Output.AppendText("<data: 01 " + length);

                for (int i = 0; i < length; i++)
                {
                    Output.AppendText(String.Format("{0:X2}", report.Data[i + 2]));
                }

                Output.AppendText("\r\n");

                if (Linked)
                {
                    serialPort1.Write(report.Data, 2, length);

                    Output.AppendText(">port: ");

                    for (int i = 0; i < length; i++)
                    {
                        Output.AppendText(String.Format("{0:X2}", report.Data[i + 2]));
                    }

                    Output.AppendText("\r\n");
                }
            }

            selectedDevice.ReadReport(ReadProcess);
        }

        private void Device_Inserted()
        {
            if (InvokeRequired)
            {
                BeginInvoke(new Action(Device_Inserted));
                return;
            }

            if (selectedDevice == null)
                return;

            if (!selectedDevice.IsOpen)
                selectedDevice.OpenDevice();

            selectedDevice.ReadReport(ReadProcess);

            if (Linked)
            {
                if (!serialPort1.IsOpen)
                {
                    serialPort1.Open();
                    //serialPort1.DiscardInBuffer();
                    //serialPort1.DiscardOutBuffer();
                    Output.AppendText(">Serial port opened\r\n");
                }
            }

            Output.AppendText(">Connected\r\n");
        }

        private void Device_Removed()
        {
            if (InvokeRequired)
            {
                BeginInvoke(new Action(Device_Removed));
                return;
            }

            if (Linked)
            {
                serialPort1.Close();
            }

            Output.AppendText(">Disconnected\r\n");

            if (selectedDevice != null)
            {
                selectedDevice.CloseDevice();
                Output.AppendText(">Serial port closed\r\n");
            }
        }


Не очень удобно, но вполне работоспособно.
smk
Код
            //virtual UART packet
            if (report.Data[0] == 0)
            {
                int length = report.Data[1];

                Output.AppendText("<data: 00 " + length);
                String data = "";

                for (int i = 0; i < length; i++)
                {
                    data += (char)(report.Data[i + 2]);
                }

                Output.AppendText(data);
                Output.AppendText("\r\n");

                if(Linked)
                    serialPort1.Write(report.Data, 2, length);
            }

            //Redut packet
            if (report.Data[0] == 1)
            {
                int length = report.Data[1];

                Output.AppendText("<data: 01 " + length);

                for (int i = 0; i < length; i++)
                {
                    Output.AppendText(String.Format("{0:X2}", report.Data[i + 2]));
                }

                Output.AppendText("\r\n");

                if (Linked)
                {
                    serialPort1.Write(report.Data, 2, length);

                    Output.AppendText(">port: ");

                    for (int i = 0; i < length; i++)
                    {
                        Output.AppendText(String.Format("{0:X2}", report.Data[i + 2]));
                    }

                    Output.AppendText("\r\n");
                }
            }


Эти части кода как я понимаю, не являются необходимыми?

А вот такая штука Вам не попадалась? Нажмите для просмотра прикрепленного файла

smk
Вот еше нашел проектик. Однако часто там выскакивают окошки об ошибках. Ошибка всегда одна - как я понимаю либо закрывается устройство раньше чем нужно либо как-то теряется указатель на него. Но в любом случае думаю стоит внимания. Может кто уже разбирался в нем и может что подсказать? Спасибо.
Нажмите для просмотра прикрепленного файла
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.