Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 24.09.2013
Сообщений: 8
1
.NET 4.x

Подключение устройства через USB

22.10.2013, 14:49. Просмотров 1795. Ответов 3
Метки нет (Все метки)

Всем доброго времени суток.
Имеется задачка: к ПК подключается устройство по USB, сказали что комп будет видеть это устройство как Virtual Port.
Мне это честно говоря ни о чем не говорит, поэтому подскажите пожалуйста где и что почитать или может есть какие то готовые решения: нужно будет отправлять команды на это устройство, а так же получать некоторые данные (в режиме реального времени постоянно будут идти какие-то данные), которые потом я уже буду отображать на форме.

Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2013, 14:49
Ответы с готовыми решениями:

Запуск USB устройства
Приветствую! Например, подключено к ПК USB устройство... Оно не активно(com порт не занят). Как...

Не срабатывает обнаружение USB устройства
Написал программу, которая определяет подключение флешки и далее работает с ней. Основное окно...

DriveInfo не отображает USB-устройства на Windows 7
Доброго времени суток. Пытаюсь получить список устройств с помощью DriveInfo.GetDrives(), но он...

Реализовать ожидание ответа от USB-устройства
Уважаемые. Существует УСБ устройство. К нему написано приложение на С#. приложение посылает...

3
0 / 0 / 0
Регистрация: 24.09.2013
Сообщений: 8
25.10.2013, 17:49  [ТС] 2
Ответ: нужно юзать класс SerialPort.
0
0 / 0 / 0
Регистрация: 24.09.2013
Сообщений: 8
17.12.2013, 12:14  [ТС] 3
Помогите пожалуйста разобраться что не так делаю.
Есть программа Terminal (https://sites.google.com/site/terminalbpp/). Подключаюсь в ней к устройству, ввожу "H:", ставлю галочку напротив "+CR", нажимаю "send" и устройство приняв эту команду отправляет нужный мне ответ.
Собственно это же мне надо получить в моей программе WindowsForms.
Пишу код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            SerialPort port = new SerialPort();
            port.PortName = "COM16";
            port.BaudRate = 115200;
            port.Parity = Parity.None;
            port.DataBits = 8;
            port.StopBits = StopBits.One;
            port.ReadTimeout = 1000;
            port.WriteTimeout = 500;
            port.Open();
            string getTextConnect = "H:\r";
            ASCIIEncoding ascii = new System.Text.ASCIIEncoding();
            byte[] b1 = ascii.GetBytes(getTextConnect);
            port.Write(b1, 0, b1.Length);
            string s1 = port.ReadExisting();
            MessageBox.Show(s1 + " " + s1.Length);
            port.Close();
MessageBox отображается пустым (длина s1 = 0), т.е. устройство не получило нужную команду и соответственно не ответило.
Может символ возврата каретки как то по другому нужно тут отправлять?

Интересный нюанс: если в программе Terminal не ставить галочку "+CR", а в строке ввода написать "H:\r", то ответ тоже не приходит. Наталкивает на мысль что символ возврата каретки какой то другой %)

Кто что знает подскажите пожалуйста.
p.s.: про DataReceived в курсе. там все аналогично получается.
0
0 / 0 / 0
Регистрация: 12.02.2014
Сообщений: 52
07.10.2014, 17:07 4
Здравствуйте, пытаюсь разобраться как сделать USB HID устройство, в контроллер зашил прогу HID-Class из примера библиотеки V-USB. вот так выглядет программа
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/pgmspace.h>   /* нужно для usbdrv.h */
#include "usbdrv.h"
 
 
struct dataexchange_t       // Описание структуры для передачи данных
{
   uchar b1;        // Я решил для примера написать структуру на 3 байта.
   uchar b2;        // На каждый байт подцепим ногу из PORTB. Конечно это
   uchar b3;        // не рационально (всего то 3 бита нужно).
};                  // Но в целях демонстрации в самый раз.
                    // Для наглядности прикрутить по светодиоду и созерцать :)
 
 
struct dataexchange_t pdata = {0, 0, 0};
 
 
PROGMEM char usbHidReportDescriptor[22] = { // USB report descriptor         // Дескриптор описывает структуру пакета данных для обмена
    0x06, 0x00, 0xff,                       // USAGE_PAGE (Generic Desktop)
    0x09, 0x01,                             // USAGE (Vendor Usage 1)
    0xa1, 0x01,                             // COLLECTION (Application)
    0x15, 0x00,                             //    LOGICAL_MINIMUM (0)        // min. значение для данных
    0x26, 0xff, 0x00,                       //    LOGICAL_MAXIMUM (255)      // max. значение для данных, 255 тут не случайно, а чтобы уложиться в 1 байт
    0x75, 0x08,                             //    REPORT_SIZE (8)            // информация передается порциями, это размер одного "репорта" 8 бит
    0x95, sizeof(struct dataexchange_t),    //    REPORT_COUNT               // количество порций (у нашем примере = 3, описанная выше структура передастся за три репорта)
    0x09, 0x00,                             //    USAGE (Undefined)
    0xb2, 0x02, 0x01,                       //    FEATURE (Data,Var,Abs,Buf)
    0xc0                                    // END_COLLECTION
};
/* Здесь мы описали только один report, из-за чего не нужно использовать report-ID (он должен быть первым байтом).
 * С его помощью передадим 3 байта данных (размер одного REPORT_SIZE = 8 бит = 1 байт, их количество REPORT_COUNT = 3).
 */
 
 
/* Эти переменные хранят статус текущей передачи */
static uchar    currentAddress;
static uchar    bytesRemaining;
 
 
/* usbFunctionRead() вызывается когда хост запрашивает порцию данных от устройства
 * Для дополнительной информации см. документацию в usbdrv.h
 */
uchar   usbFunctionRead(uchar *data, uchar len)
{
    if(len > bytesRemaining)
        len = bytesRemaining;
 
    uchar *buffer = (uchar*)&pdata;
 
    if(!currentAddress)        // Ни один кусок данных еще не прочитан.
    {                          // Заполним структуру для передачи
        if ( PINB & _BV(1) )
            pdata.b1 = 1;
        else
            pdata.b1 = 0;
 
 
        if ( PINB & _BV(2) )
            pdata.b2 = 1;
        else
            pdata.b2 = 0;
 
 
        if ( PINB & _BV(3) )
            pdata.b3 = 1;
        else
            pdata.b3 = 0;
    }
 
    uchar j;
    for(j=0; j<len; j++)
        data[j] = buffer[j+currentAddress];
 
    currentAddress += len;
    bytesRemaining -= len;
    return len;
}
 
 
/* usbFunctionWrite() вызывается когда хост отправляет порцию данных к устройству
 * Для дополнительной информации см. документацию в usbdrv.h
 */
uchar   usbFunctionWrite(uchar *data, uchar len)
{
    if(bytesRemaining == 0)
        return 1;               /* конец передачи */
 
    if(len > bytesRemaining)
        len = bytesRemaining;
 
    uchar *buffer = (uchar*)&pdata;
    
    uchar j;
    for(j=0; j<len; j++)
        buffer[j+currentAddress] = data[j];
 
    currentAddress += len;
    bytesRemaining -= len;
 
    if(bytesRemaining == 0)     // Все данные получены
    {                           // Выставим значения на PORTB
        if ( pdata.b1 )
            PORTB |= _BV(1);
        else
            PORTB &= ~_BV(1);
 
 
        if ( pdata.b2 )
            PORTB |= _BV(2);
        else
            PORTB &= ~_BV(2);
 
 
        if ( pdata.b3 )
            PORTB |= _BV(3);
        else
            PORTB &= ~_BV(3);
    }
 
    return bytesRemaining == 0; /* 0 означает, что есть еще данные */
}
 
/* ------------------------------------------------------------------------- */
 
usbMsgLen_t usbFunctionSetup(uchar data[8])
{
usbRequest_t    *rq = (void *)data;
 
    if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){    /* HID устройство */
        if(rq->bRequest == USBRQ_HID_GET_REPORT){  /* wValue: ReportType (highbyte), ReportID (lowbyte) */
            // у нас только одна разновидность репорта, можем игнорировать report-ID
            bytesRemaining = sizeof(struct dataexchange_t);
            currentAddress = 0;
            return USB_NO_MSG;  // используем usbFunctionRead() для отправки данных хосту
        }else if(rq->bRequest == USBRQ_HID_SET_REPORT){
            // у нас только одна разновидность репорта, можем игнорировать report-ID
            bytesRemaining = sizeof(struct dataexchange_t);
            currentAddress = 0;
            return USB_NO_MSG;  // используем usbFunctionWrite() для получения данных от хоста
        }
    }else{
        /* остальные запросы мы просто игнорируем */
    }
    return 0;
}
/* ------------------------------------------------------------------------- */
 
int main(void)
{
    DDRB = 0b00001110;      // PB1,PB2,PB3 - выход
 
    usbInit();
    usbDeviceDisconnect();  // принудительно отключаемся от хоста, так делать можно только при выключенных прерываниях!
    
    uchar i = 0;
    while(--i){             // пауза > 250 ms
        _delay_ms(1);
    }
    
    usbDeviceConnect();     // подключаемся
 
    sei();                  // разрешаем прерывания
 
    for(;;){                // главный цикл программы
        usbPoll();          // эту функцию надо регулярно вызывать с главного цикла, максимальная задержка между вызовами - 50 ms
    }
    return 0;
}
/* ------------------------------------------------------------------------- */
А для компьютера я хочу написать программу на C# с библиотекой LibUsbDotNet. Но у меня получается только найти устройство и вывести некоторую информацию о нем. как передать и принять данные не могу понять. В статье по которой это делалось написано: "Когда хост хочет отправить данные устройству он дает команду HID_SET_REPORT, при этом V-USB внутри микроконтроллера вызывает функцию usbFunctionWrite(). Аналогично когда хост хочет прочитать данные с устройства, он дает команду HID_GET_REPORT, при этом V-USB вызовет функцию usbFunctionRead()." Но что за HID_SET_REPORT и HID_GET_REPORT не могу понять. Помогите если кто может
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2014, 17:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Работа с USB: программа не видит устройства
Столкнулся с проблемой, когда- то писал программу которая слушала com- порт. Работала как надо,...

Как реализовать считывание входных данных с usb устройства
как на C# реализовать считывание входных данных с веб камеры или другого usb устройства.

Требуется написать программу-контроллер для некоего USB-устройства
Проблема заключается в следующем как работать с этим usb устройством как его добавить в программу...

Подключение устройства и работа с ним через USB
Всем привет. Подскажите, есть устройства для печати. По одному нужно подключать в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.