Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 1
Регистрация: 10.06.2014
Сообщений: 59

Не могу достучаться до считывателя

24.03.2017, 10:13. Показов 1879. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Купил считыватель, нужно его запрограммировать, никогда этого не делал и толком не знаю с чего начать, но кое что нашел в нете. Считыватель UART подключается при помощи usb. В диспетчере устройств его видно подключен как COM4.
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
using System;
using System.IO.Ports;
using System.Threading;
 
 
namespace ComPortExample
{
    class Program
    {
        static bool _continue;
        static int sch_error;
        static SerialPort _serialPort;
        //static string stringValue;
        static void Main(string[] args)
        {
 
            string message;
            message = string.Empty;
 
            StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
            Thread readThread = new Thread(Read);
 
            // Create a new SerialPort object with default settings.
            //_serialPort = new SerialPort();
 
            // Allow the user to set the appropriate properties.
            /*_serialPort.PortName = "COM4";
            _serialPort.BaudRate = 9600;
            _serialPort.Parity = Parity.Even;
            _serialPort.DataBits = 8;
            _serialPort.StopBits = StopBits.One;
            _serialPort.Handshake = Handshake.None;*/
 
            _serialPort = new SerialPort("COM4", 9600, Parity.Even, 8, StopBits.One);
            // Set the read/write timeouts
            _serialPort.ReadTimeout = 2000;
            _serialPort.WriteTimeout = 2000;
 
          
            _serialPort.Open();
            _continue = true;
            readThread.Start();
 
            Console.WriteLine("Type QUIT to exit");
 
            while (_continue)
            {
              
                if (stringComparer.Equals("quit", message))
                {
                    _continue = false;
                }
                else
                {
                    string[] hexValuesSplit = { "10", "1", "c3", "0", "11", "e5" };
                    foreach (String hex in hexValuesSplit)
                    {
                        // Convert the number expressed in base-16 to an integer.
                        int value = Convert.ToInt32(hex, 16);
                        // Get the character corresponding to the integral value.
                        message += Char.ConvertFromUtf32(value);
                    }
                    _serialPort.WriteLine(
                        String.Format("{0}", message));
                    message = string.Empty;
                    Thread.Sleep(1000);
                }
            }
 
            readThread.Join();
            
            while (true)
            { }
            _serialPort.Close();
        }
        public static void Read()
        {
            while (_continue)
            {
                try
                {
                    string kod_kat = string.Empty;
                    sch_error=0;
                    kod_kat = _serialPort.ReadLine();
                    int str_summ = 0;
                    for(int i=0; i<kod_kat.Length-2;i=i+2)
                    {
                        str_summ = str_summ + Convert.ToInt32(kod_kat.Substring(i, 2), 16); //SUBSTR(kod_kat,i,2));
                    }
                    str_summ = str_summ % 256;
 
 
                  if(str_summ != Convert.ToInt32(kod_kat.Substring(kod_kat.Length-2, 2), 16))
                  {
                    Console.WriteLine("Ошибка контрольной суммы");
                    Console.ReadKey();
                    sch_error = sch_error + 1;
                    if(sch_error>5)
                    {
                      Console.WriteLine("Неустранимая ошибка! Свяжитесь с программистом");
                      Console.ReadKey();
                    }
        
                  }
                  if(kod_kat.Substring(0,2)!="10")
                  {
                    Console.WriteLine("Ошибка маркера начала сообщения");
                    Console.ReadKey();
    
                    if(sch_error>5)
                    {
                      Console.WriteLine("Неустранимая ошибка! Свяжитесь с программистом, Считывание карточки");
                      Console.ReadKey();
                    }
                  }
                  if(kod_kat.Substring(4,2)!="C3")
                  {
                      Console.WriteLine("Ошибка кода команды ("+kod_kat+")");
                      Console.ReadKey();
        
                      if(sch_error>5)
                      {
                        Console.WriteLine("Неустранимая ошибка! Свяжитесь с программистом. ",0+16,"Считывание карточки");
                        Console.ReadKey();
                      }
                  }
                  if(kod_kat.Substring(6,2)=="02")
                  {
                    if(sch_error>5)
                    {
                      Console.WriteLine("Неустранимая ошибка! Свяжитесь с программистом. Считывание карточки");
                      Console.ReadKey();
                    }
                  }
                  if(kod_kat.Substring(6,2)=="08")
                  {
                    if(kod_kat.Substring(8,4)=="0080")
                    {
                      Console.WriteLine(kod_kat.Substring(12,10));
                      Console.WriteLine("Считывание произошло успешно!");
                      Console.ReadKey();
                      sch_error = 0;
                    }
                  }
                }
                catch (TimeoutException) { }
                Thread.Sleep(1000);
            }
        }
 
 
    }
}
В функции Read() срабатывает исключение:"Время ожидания операции истекло."
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.03.2017, 10:13
Ответы с готовыми решениями:

Ошибка в TextBox, не могу достучаться до Bookmark в Word
Ребята, привет. Осваиваю C# на примере работы с Word, через шаблоны. Вообщем Задача проста: достучаться до закладки в шаблоне и через поле...

Не могу достучаться по SSH
подключаюсь по ssh до сервака, поднимаю там web-сервер на 3000й порт, с сервака через lynx запросы на localhost:3000 поступают, а вот если...

Не могу достучаться в сеть за микротиком
Приветствую, форумчане. Задачка для первоклашек, но, видимо, я до них не дотягиваю (( Есть Микротики рубоард 2011. Используется как...

9
0 / 0 / 0
Регистрация: 24.03.2017
Сообщений: 2
24.03.2017, 11:54
Что за считыватель? Какая марка, модель. Их очень много всяких разных. Лучше сфоткай и покажи что за "зверь".
0
0 / 0 / 1
Регистрация: 10.06.2014
Сообщений: 59
24.03.2017, 13:24  [ТС]
Код выполняется на моем компьютере, устройство подключено к usb порту. Использую считыватель BRAVO
Протокол
Кликните здесь для просмотра всего текста
6. Протокол обмена

Обмен между считывателем и компьютером осуществляется с помощью пере-дачи специальных команд и приема ответов.
Считыватель поддерживает два режима чтения карт (режимы программируются командой 0xC1, описание которой приведено ниже):
– выдача кода карты по запросу;
– выдача кода карты по факту поднесения карты.
Если установлен режим работы 0, то для считывания карты могут использовать-ся команды 0xC3, 0xC4 и 0xCE. Если установлен режим работы 1, то идентификатор карты выдается при ее поднесении в формате ответа на команду 0xC3.
Переключение между режимами осуществляется посредством команд. Опи-сание всего набора команд и их формата приведено ниже.
Скорость передачи по RS-232 программируется и может принимать значения 1200, 2400, 4800, 9600, 19200, 38400, 115200 бит/с. По умолчанию установлена ско-рость 9600 бит/с.
Формат слова: 1 старт-бит, 8 бит, контроль по четности,1стоп-бит.
Формат команды представлен в таблице 3.

Таблица 3 – Формат команды

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xXX код команды
4 0xXX длина параметров команды
5 [0xXX, … 0xXX] параметры команды
6 0x11 маркер конца сообщения
7 0xXX контрольная сумма сообщения

Формат ответа приведен в таблице 4.

Таблица 4 – Формат ответа

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xXX код команды
4 0xXX длина результата выполнения команды
5 [0xXX, … 0xXX] код ошибки + результат выполнения команды (для команд, которые возвращают значение)
6 0x11 маркер конца сообщения
7 0xXX контрольная сумма сообщения

Контрольная сумма рассчитывается как арифметическая сумма байт от маркера начала до маркера конца включительно.
В случае возникновения ошибок для любых команд ответ выглядит, как показано в таблице 5.



Таблица 5 – Формат ошибки

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xXX код команды, в результате получения кото-рой возникла ошибка
4 0x01 длина ошибки
5 1, 21, 22 код ошибки
6 0x11 маркер конца сообщения
7 0xXX контрольная сумма сообщения

Могут возникать следующие ошибки (в десятичном формате):
01 – неправильный код команды, неправильная длина параметров,
21 – ошибка контрольной суммы,
22 – ошибка данных (неправильный параметр, например месяц = 13).

Используются следующие команды:
0xC0 – Прочитать/записать идентификатор устройства

Вид запроса команды приведен в таблице 6. Если в запросе длина параметров равна 0, то производится чтение идентификатора считывателя. Вид ответа приведен в таблице 7. Если длина параметров отличная от приведенной, то выдается ошибка с кодом 1. В случае возникновения ошибки, генерируется ошибка, приведенная в табли-це 8. Будут записаны все параметры, которые соответствуют длине параметров (на-пример, при длине параметров = 3, будут записаны тип устройства и версия прошив-ки).

Таблица 6 – Запрос команды 0xC0

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xC0 код команды
4 0, 1, 3, 6, 12, 14 длина параметров
5 0xXX тип устройства (описание приведено ниже)
6 0xXXXX версия прошивки (2 байта, начиная со старшего)
7 0-99 дата выпуска прошивки (год)
8 1-12 дата выпуска прошивки (месяц)
9 1-31 дата выпуска прошивки (день)
10 0xXXXXXXXXXXXX Серийный номер устройства (6 байт, начи-ная со старшего)
11 0xXXXX Дополнительная информация (2 байта, на-чиная со старшего)
13 0x11 маркер конца сообщения
14 0xXX контрольная сумма сообщения








Таблица 7 – Ответ на команду 0xC0

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xC0 код команды
4 15 длина параметров
5 0 код ошибки (0 – ошибки нет)
6 0x00, 0x06 тип устройства (описание приведено ниже)
7 0xXXXX версия прошивки (2 байта, начиная со старшего)
8 0-99 дата выпуска прошивки (год)
9 1-12 дата выпуска прошивки (месяц)
10 1-31 дата выпуска прошивки (день)
11 0xXXXXXXXXXXXX Серийный номер устройства (6 байт, начи-ная со старшего)
12 0xXXXX Дополнительная информация (2 байта, на-чиная со старшего)
13 0x11 маркер конца сообщения
14 0xXX контрольная сумма сообщения


Таблица 8 – Формат ошибки команды 0xC0

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xС0 код команды, в результате получения кото-рой возникла ошибка
4 0x01 длина ошибки
5 4 код ошибки (ошибка записи в EEPROM)
6 0x11 маркер конца сообщения
7 0xXX контрольная сумма сообщения

0xC1 – Прочитать/записать параметры устройства

Вид запроса команды приведен в таблице 9. Если в запросе длина параметров равна 0, то производится чтение параметров считывателя. Вид ответа приведен в таб-лице 10. Если длина параметров больше 6, то выдается ошибка с кодом 1. В случае возникновения ошибки, генерируется ошибка, приведенная в таблице 11. Будут запи-саны все параметры, которые соответствую длине параметров (например, при длине параметров = 3, будут записаны тип устройства, его адрес и скорость обмена).


Таблица 9 – Запрос команды 0xC1

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xC1 код команды
4 0-6 длина параметров
6 0xXX тип устройства (описание приведено ниже)
7 0xXX адрес устройства
8 0 – 7 скорость обмена (описание приведено ниже, по умолчанию 3 = 9600бит/с)
9 0xXX период чтения карты (время хранения карты после ее прочтения, 1=100мс, по умолчанию 10 = 1с)
10 0, 1 режим работы устройства (0 – выдача кода карты по запросу, 1 – выдача кода карты по факту подне-сения карты)
11 0x11 маркер конца сообщения
12 0xXX контрольная сумма сообщения

Таблица 10 – Ответ на команду 0xC1

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xC0 код команды
4 6 длина параметров
5 0 код ошибки (0 – ошибки нет)
6 0xXX тип устройства (описание приведено ниже)
7 0xXX адрес устройства
8 0 – 7 скорость обмена (по умолчанию 3 = 9600бит/с)
9 0xXX период чтения карты (время хранения карты после ее прочтения, 1=100мс, по умолчанию 10 = 1с)
10 0, 1 режим работы устройства
11 0x11 маркер конца сообщения
12 0xXX контрольная сумма сообщения

Таблица 11 – Формат ошибки команды 0xC1


№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xС1 код команды, в результате получения кото-рой возникла ошибка
4 0x01 длина ошибки
5 4 код ошибки (ошибка записи в EEPROM)
6 0x11 маркер конца сообщения
7 0xXX контрольная сумма сообщения

При перезаписи адреса необходимо учитывать, что ответ будет с новым адре-сом. Скорость изменится после выключения/включения питания.
Используются следующие параметры для записи скорости обмена:
0 - 1200 бит/с;
1 - 2400 бит/с;
2 - 4800 бит/с;
3 - 9600 бит/с;
4 - 19200 бит/с;
5 - 38400 бит/с;
6 - 57600 бит/с;
7 - 115200 бит/с.
Для определения типа устройства используются параметры приведенные ниже:
0 – Тип не определен;
6 – Контрольный считыватель СBK-01 с интерфейсом RS232, предназначенный для считывания карт совместимых с Em-Marin H4001 (125кГц);
7 – Контрольный считыватель СBK-01TM с интерфейсом RS232, предназначен-ный для считывания ключей Touch Memory;
8 - контрольный считыватель c интерфейсом USB, предназначенный для считы-вания карт совместимых с Em-Marin H4001 (125кГц);
9 - контрольный считыватель c интерфейсом USB, предназначенный для считы-вания ключей Touch Memory;

0xC2 – Прочитать параметры устройства

Команда используется только для чтения параметров. Формат команды пред-ставлен в таблице 3. Длина параметров в запросе всегда равна 0 (параметры не пере-даются). Формат ответа аналогичен формату команды 0xC2, приведенному в таблице 12. Единственное отличие: код команды = 0xC2.

0xC3 – Прочитать состояние устройства

Команда используется для чтения состояния устройства. Формат команды пред-ставлен в таблице 3. Длина параметров в запросе всегда равна 0 (параметры не пере-даются). Если есть прочитанная карты, то вид ответа показан в таблице 12, если нет, то в таблице 13. Во избежание потери идентификатора прочитанной карты, учитывать, что период опроса считывателя, должен быть меньше, чем период чтения карты.

Таблица 12 – Ответ 1 на команду 0xC3

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xC3 код команды
4 8 длина параметров
5 0 код ошибки (0 – ошибки нет)
6 0x80 состояние устройства (0x80 – прочитана карта)
7 0xID0…0xID5 идентификатор карты (5 байт, начиная с младшего)
8 0x00 старший байт идентификатора (равен 0x00 для со-вместимости с ключами Touch Memory)
9 0x11 маркер конца сообщения
10 0xXX контрольная сумма сообщения





Таблица 13 – Ответ 2 на команду 0xC3

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xC3 код команды
4 2 длина параметров
5 0 код ошибки (0 – ошибки нет)
6 0x00 состояние устройства (0x00 – нет прочитаной карты)
7 0x11 маркер конца сообщения
8 0xXX контрольная сумма сообщения

0xC4, 0xCE – Прочитать состояние устройства

Команда используется для чтения карты из памяти считывателя. Формат коман-ды представлен в таблице 3. Длина параметров в запросе всегда равна 0 (параметры не передаются). Если есть прочитанная карта, то вид ответа показан в таблице 14, ес-ли нет, то в таблице 15.

Таблица 14 – Ответ на команду 0xC4, 0xCE

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xС4, 0xСE код команды
4 7 длина параметров
5 0 код ошибки (0 – ошибки нет)
6 0xID0…0xID5 идентификатор карты (5 байт, начиная с младшего)
7 0x00 старший байт идентификатора (равен 0x00 для со-вместимости с ключами Touch Memory)
8 0x11 маркер конца сообщения
9 0xXX контрольная сумма сообщения

Таблица 15 – Формат ошибки команды 0xC4, 0xCE


№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xС4, 0xСE код команды
4 0x01 длина ошибки
5 20 код ошибки (нет прочитанной карты)
6 0x11 маркер конца сообщения
7 0xXX контрольная сумма сообщения


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

Добавлено через 2 минуты
Мой адресс устройства 00000002
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
24.03.2017, 13:39
У вас бинарный протокол, а вы его считываете как текстовый, да ещё и ожидаете конец строки найти.
0
0 / 0 / 1
Регистрация: 10.06.2014
Сообщений: 59
24.03.2017, 13:50  [ТС]
Хорошо, вот еще один пример работы с данным считывателем. Данные я здесь тоже не принимаю.
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
using System;
using System.IO.Ports;
using System.Threading;
using System.Collections.Generic;
 
namespace ComPort.Test
{
 
    public class CommandGenerator
    {
 
        public List<byte> getCommand0xC1(byte period, byte mode)
        {
            List<byte> command = new List<byte>();
            command.Add(0x10);
            command.Add(0x02);
            command.Add(Commands.CHANGE_MODE);
            command.Add(0x00);
            command.Add(0x00);
            command.Add(0x02);
            command.Add(0x03);
            command.Add(period);
            command.Add(mode);
            command.Add(0x11);
            command.Add(getCRC(command));
            return command;
 
           
        }
 
        private byte getCRC(List<byte> data)
        {
            byte result = 0;
            foreach (byte item in data)
            {
                result += item;
            }
            return result;
        }
 
    }
 
    public static class Commands
    {
 
        public const byte CHANGE_MODE = 0xC1;
 
    }
 
    public class Program
    {
 
        private static bool _continue;
        private static SerialPort _serialPort;
 
        public static void Main(string[] args)
        {
            CommandGenerator commandGenerator = new CommandGenerator();
 
            _serialPort = new SerialPort("COM4", 9600, Parity.Even, 8, StopBits.One); // вот, теперь я вижу что мой первый вариант не подходил по протоколу. Теперь есть контроль чётности.
            _serialPort.ReadTimeout = 1000;
            _serialPort.WriteTimeout = 1000;
            _serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
            _serialPort.Open();
 
            Thread.Sleep(500); // ждём
 
            sendCommand(commandGenerator.getCommand0xC1(0x0A, 0x01)); // меняем режим и ждём когда поднесут карточку
 
            for (; ; )
            {
                Thread.Sleep(200); // даём остальным потокам 200 миллисекунд на работу
            }
 
            _serialPort.Close(); // недостижимый код, но, для теста сойдёт
        }
 
        private static void DataReceived(object sender, SerialDataReceivedEventArgs e)
        { // что то пришло от считывателя
            Console.WriteLine(_serialPort.ReadLine()); // пытаемся прочитать что же там пришло
        }
 
        private static void sendCommand(List<byte> command)
        {
            _serialPort.Write(command.ToArray(), 0, command.Count);
        }
 
    }
 
}
 
/*
 
1  0x10  маркер начала сообщения
2  0xXX  адрес устройства
3  0xC1  код команды
4  0-6   длина параметров
6  0xXX  тип устройства (описание приведено ниже)
7  0xXX  адрес устройства
8  0 – 7 скорость обмена (описание приведено ниже, по умолчанию 3 = 9600бит/с)
9  0xXX  период чтения карты (время хранения карты после ее прочтения, 1=100мс, по умолчанию 10 = 1с)
10 0, 1  режим работы устройства (0 – выдача кода карты по запросу, 1 – выдача кода карты по факту подне-сения карты)
11 0x11  маркер конца сообщения
12 0xXX  контрольная сумма сообщения
*/
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
24.03.2017, 18:58
Для начала взяли бы любой терминал rs-232 (например) и попробовали бы связаться с устройством "вручную", посредством посылки пакетов из терминала.
Когда научитесь управлять устройством вручную, тогда уже можно будет тоже самое сделать программно.
0
0 / 0 / 1
Регистрация: 10.06.2014
Сообщений: 59
28.03.2017, 16:34  [ТС]
Достучался к 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LibUsbDotNet;
using LibUsbDotNet.DeviceNotify;
using LibUsbDotNet.Main;
 
namespace HidUsb
{
    class Program
    {
        public static UsbDevice MyUsbDevice;
 
        #region SET YOUR USB Vendor and Product ID!
 
 
        public static UsbDeviceFinder MyUsbFinder;
 
        #endregion
 
        static void Main(string[] args)
        {
 
 
            ErrorCode ec = ErrorCode.None;
 
            try
            {
                MyUsbFinder = new UsbDeviceFinder(Int32.Parse("0403", System.Globalization.NumberStyles.AllowHexSpecifier), Int32.Parse("6001", System.Globalization.NumberStyles.AllowHexSpecifier));
                // Find and open the usb device.
                MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);
 
                // If the device is open and ready
                if (MyUsbDevice == null) throw new Exception("Device Not Found.");
 
                //Console.WriteLine(MyUsbDevice.Info.ProductString);
                //Console.ReadKey();
                // If this is a "whole" usb device (libusb-win32, linux libusb-1.0)
                // it exposes an IUsbDevice interface. If not (WinUSB) the
                // 'wholeUsbDevice' variable will be null indicating this is
                // an interface of a device; it does not require or support
                // configuration and interface selection.
                IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
                if (!ReferenceEquals(wholeUsbDevice, null))
                {
                    // This is a "whole" USB device. Before it can be used,
                    // the desired configuration and interface must be selected.
 
                    // Select config #1
                    wholeUsbDevice.SetConfiguration(1);
 
                    // Claim interface #0.
                    wholeUsbDevice.ClaimInterface(0);
                }
 
 
 
                // open write endpoint
                UsbEndpointWriter writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep02);
 
                // write data, read data
                int bytesWritten;
                ec = writer.Write(new byte[] { 0x10, 0x02, 0xC1, 0x05, 0x00, 0x02, 0x03, 0x0A, 0x00, 0x11, 0xf3 }, 2000, out bytesWritten); // specify data to send
 
                if (ec != ErrorCode.None)
                    throw new Exception(UsbDevice.LastErrorString);
 
                // open read endpoint
                UsbEndpointReader reader =
                MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);
 
                byte[] readBuffer = new byte[1024];
                while (ec == ErrorCode.None)
                {
                    int bytesRead;
 
                    // If the device hasn't sent data in the last 100 milliseconds,
                    // a timeout error (ec = IoTimedOut) will occur.
                    ec = reader.Read(readBuffer, 250, out bytesRead);
 
                    if (bytesRead == 0)
                        throw new Exception("No more bytes!");
 
                    // Write that output to the console.
                    Console.WriteLine(BitConverter.ToString(readBuffer, 0, bytesRead));
                }
 
            }
            catch (Exception ex)
            {
                Console.WriteLine();
                Console.WriteLine((ec != ErrorCode.None ? ec + ":" : String.Empty) + ex.Message);
            }
            finally
            {
                if (MyUsbDevice != null)
                {
                    if (MyUsbDevice.IsOpen)
                    {
                        // If this is a "whole" usb device (libusb-win32, linux libusb-1.0)
                        // it exposes an IUsbDevice interface. If not (WinUSB) the
                        // 'wholeUsbDevice' variable will be null indicating this is
                        // an interface of a device; it does not require or support
                        // configuration and interface selection.
                        IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
                        if (!ReferenceEquals(wholeUsbDevice, null))
                        {
                            // Release interface #0.
                            wholeUsbDevice.ReleaseInterface(0);
                        }
 
                        MyUsbDevice.Close();
                    }
                    MyUsbDevice = null;
 
                    // Free usb resources
                    UsbDevice.Exit();
 
                }
 
                // Wait for user input..
                Console.ReadKey();
            }
        }
 
 
    }
}
Данные 01-60
0
0 / 0 / 1
Регистрация: 10.06.2014
Сообщений: 59
29.03.2017, 14:12  [ТС]
Возможно что под windows7 x64 где-то стоит запрет на прием и передачу?

Добавлено через 23 секунды
Дело в том что это устройство я открыть могу и даже послать данные, но получить не получается.
Такая же ситуация с программой Terminal. Там я устанавливаю настройки, открываю порт, вижу что данные передаются(в строке состояния написано порт открыт, Тх постоянно меняется, но Rx постоянно ноль). Такая же ситуация если установить DTR, RTS.
0
0 / 0 / 0
Регистрация: 24.03.2017
Сообщений: 2
29.03.2017, 14:39
dodik78781, Переустанови винду, может поможет.
0
0 / 0 / 1
Регистрация: 10.06.2014
Сообщений: 59
28.04.2017, 10:11  [ТС]
Продал считыватель, уже не нужно. Всем спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.04.2017, 10:11
Помогаю со студенческими работами здесь

Не могу достучаться до Oracle'a из Delphi
Всем привет, особенно тем, кто работает с Oracle'ом из-под Delphi. Верной дорогой идёте, товарищи! Счастливые! А я вот не могу... Есть у...

Не могу достучаться до MPU-6000
Здравствуйте. Необходимо считать регистры данных акселерометра и гироскопа микросхемы MPU-6000 (по SPI через Atmego32u4). Но как я не...

Не могу достучаться до свойств объекта
Ребята помогите разобраться учусь создавать динамически объекты в отчёте FastReport и столкнулся стакой проблемой не могу достучаться до...

Не могу достучаться к элементам класса Variant
Здравствуйте! У меня есть три класса, и в каждом классе есть массив объектов ниже стоящего класса. Option Explicit Private...

Не могу достучаться до RadioButton в Navigation Drawer item?
Пытаюсь в NDrawer найти RadioButton и не получается (кста со SwitchCompat такая же проблема) стучусь к нему так: ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru