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

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

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

Author24 — интернет-сервис помощи студентам
Купил считыватель, нужно его запрограммировать, никогда этого не делал и толком не знаю с чего начать, но кое что нашел в нете. Считыватель 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 запросы...

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

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

9
0 / 0 / 0
Регистрация: 24.03.2017
Сообщений: 2
24.03.2017, 11:54 2
Что за считыватель? Какая марка, модель. Их очень много всяких разных. Лучше сфоткай и покажи что за "зверь".
0
0 / 0 / 1
Регистрация: 10.06.2014
Сообщений: 59
24.03.2017, 13:24  [ТС] 3
Код выполняется на моем компьютере, устройство подключено к 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]
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
24.03.2017, 13:39 4
У вас бинарный протокол, а вы его считываете как текстовый, да ещё и ожидаете конец строки найти.
0
0 / 0 / 1
Регистрация: 10.06.2014
Сообщений: 59
24.03.2017, 13:50  [ТС] 5
Хорошо, вот еще один пример работы с данным считывателем. Данные я здесь тоже не принимаю.
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]
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
24.03.2017, 18:58 6
Для начала взяли бы любой терминал rs-232 (например) и попробовали бы связаться с устройством "вручную", посредством посылки пакетов из терминала.
Когда научитесь управлять устройством вручную, тогда уже можно будет тоже самое сделать программно.
0
0 / 0 / 1
Регистрация: 10.06.2014
Сообщений: 59
28.03.2017, 16:34  [ТС] 7
Достучался к 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  [ТС] 8
Возможно что под windows7 x64 где-то стоит запрет на прием и передачу?

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru