На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Не могу достучаться до считывателя. , Не могу достучаться до считывателя.
    Купил считыватель, нужно его запрограммировать, никогда этого не делал и толком не знаю с чего начать, но кое что нашел в нете.
    Пример моей программы:
    ExpandedWrap disabled
      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(250);
                      }
                  }
       
                  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) { }
                  }
              }
       
       
          }
      }


    Добавлено
    Считыватель UART подключается при помощи usb. В диспетчере устройств его видно подключен как COM4.

    Добавлено
    В функции Read() срабатывает исключение:"Время ожидания операции истекло."
      Продублирую сюда.

      Цитата
      А если я в PuTTY установил нужные настройки и ничего не произошло? Что это значит?


      Если настройки действительно верные (образец, который нашёл поиском) - значит устройство с которым вы соединяетесь - молчит.

      Тут несколько вариантов почему это происходит:

      1. Изучите протокол этого устройства. Есть вероятность, что оно ждёт вашей команды, для начала протокола.
      2. Убедитесь что устройству вообще положено отсылать какие либо данные (ну, например, в случаях когда устройство может только читать и выполнять ваши команды)
      3. Убедитесь что устройство работает.
      4. Убедитесь что устройство исправно.

      + Вы до сих пор не объяснили что за устройство (Ваша фраза "у меня есть считыватель" даёт мне столько же информации сколько Вам моя фраза "у меня есть волшебная программа").

      + Я как программист, никогда бы не начинал программу не зная протокола. В вашем случае - что вы ожидаете от устройства? Оно пингует то к чему подсоединено через COM порт? или же вы проводите манипуляции со считывателем и ожидаете данные? В обоих вариантах, надо знать протокол. Если вы потрудитесь его здесь описать, вашу проблему можно решить за 10 минут.


      Ещё момент. Где конкретно выполняется Ваш код? Его выполняет само устройство, или Ваш компьютер?
      Сообщение отредактировано: VisualProg -
        Код выполняется на моем компьютере, устройство подключено к 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 контрольная сумма сообщения
          Цитата
          считыватель, нужно его запрограммировать

          Цитата
          Код выполняется на моем компьютере

          Вот, теперь определились что в действительности считыватель программировать не надо. Уже проще. (Хотя, меня и смущало что он понимает шарп, но, вдруг чудесными манипуляциями ваша ИДЕ могла делать код на Си :D )

          Цитата
          Протокол


          Отлично!
          Как я понимаю, проще всего пойти по следующему алгоритму:

          1. Создать экземпляр порта, и подключиться к считывателю.
          2. Отослать команду смены режима на 1. (из описания протокола этот момент я не понял... либо слать два байта "0xC1 0x01", либо слать один "0xC1" - не понятно)
          3. Поднести карту к считывателю.
          4. Получить сообщение в консоль.

          ExpandedWrap disabled
                    using System;
                    using System.IO.Ports;
                    using System.Threading;
                
                    namespace ComPortExample
                    {
                        class Program
                        {
                            private const char CHANGE_MODE = 0xC1;
                
                            private static bool       _continue;
                            private static SerialPort _serialPort;
                
                            public static void Main(string[] args)
                            {
                
                                _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); // ждём
                                _serialPort.Write(CHANGE_MODE); // меняем режим и ждём когда поднесут карточку
                
                                    for(;;) {
                                        Thread.Sleep(200); // даём остальным потокам 200 миллисекунд на работу
                                    }
                
                                _serialPort.Close(); // недостижимый код, но, для теста сойдёт
                            }
                
                            private static void DataReceived(object sender, SerialDataReceivedEventArgs e) { // что то пришло от считывателя
                                Console.WriteLine(_serialPort.ReadLine()); // пытаемся прочитать что же там пришло
                            }
                
                        }
                
                    }


          А теперь опишите, что Вы делаете во время теста?

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


          Хм, даже так... Тогда надо ещё определить алгоритм контрольной суммы и узнать что такое адрес устройства. После чего можно модифицировать пример который я привёл выше.
          Сообщение отредактировано: VisualProg -
            VisualProg
            Для выполнения команды C1 надо послать 12 байт (таблица 9)
              Цитата MBo @
              VisualProg
              Для выполнения команды C1 надо послать 12 байт (таблица 9)

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

                  :lol: Туплю)

                  Как пример. К сожалению, протестировать не на чем.

                  ExpandedWrap disabled
                    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(Commands.CHANGE_MODE);
                                command.Add(0x00);
                                //command.Add(0xXX);
                                //command.Add(0xXX);
                                //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  контрольная сумма сообщения
                    */
                  Сообщение отредактировано: VisualProg -
                    Я так понял что адрес устройства можно определить в диспетчере устройств. Выбираем порт в диспетчере устройств, потом сведения и выбираем адресс.

                    Добавлено
                    Мой адресс устройства 00000002

                    Добавлено
                    Пример супер!!!
                      Для функции getCommand0xC1 Вы использовали Таблица 9? Если да то функция getCommand0xC1 будет выглядеть
                      ExpandedWrap disabled
                        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;

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

                        Отталкивался от этого описания:
                        Цитата
                        Если в запросе длина параметров равна 0, то производится чтение параметров считывателя.

                        В общем:

                        ExpandedWrap disabled
                          command.Add(0x10);
                          command.Add(0x02);
                          command.Add(Commands.CHANGE_MODE);
                          command.Add(0x00); // <- говорим что параметров нет
                          command.Add(0x00); //1
                          command.Add(0x02); //2
                          command.Add(0x03); //3 - это наши параметры, поэтому я их и не включал, так как до этого мы сказали что их не будет.
                          command.Add(period);
                          command.Add(mode);
                          command.Add(0x11);
                          command.Add(getCRC(command));


                        Но, есть и такое описание:

                        Цитата
                        Будут запи-саны все параметры, которые соответствую длине параметров (например, при длине параметров = 3, будут записаны тип устройства, его адрес и скорость обмена).


                        И возможно, что тогда, вместо 0x00 длинны параметров, надо указать число 0x05 (3 параметра + ещё 2 - период считывания и режим).

                        Как я понимаю, вы в любом случае должны получить хотя бы ошибку (то есть, подобный команде набор из 7 байт). если не приходит даже она - надо разбираться почему. Можно попробовать указать заранее невалидные данные, чтобы добиться этой ошибки принудительно, например, указать длину параметров как 0x08.

                        Как подметили в предыдущем посте - есть ли у Вас программы идущие в комплект к этому устройству? Если бы был элементарный родной сниффер, для отладки - было бы куда проще чем пытаться чего то добиться в слепую.
                          Программ нет, сниффера тоже, пишу по приборам.
                            Через порт тулс можно проверить устройство?
                              Достучался до устройства через библиотеку LibUsbDotNet. Осталось разобраться как обратиться к ком порту
                              ExpandedWrap disabled
                                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.");
                                 
                                                // 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 read endpoint 1.
                                                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 5 seconds,
                                                    // a timeout error (ec = IoTimedOut) will occur.
                                                    ec = reader.Read(readBuffer, 5000, out bytesRead);
                                 
                                                    if (bytesRead == 0) throw new Exception(string.Format("{0}:No more bytes!", ec));
                                                    Console.WriteLine("{0} bytes read", bytesRead);
                                 
                                                    // Write that output to the console.
                                                    Console.Write(Encoding.Default.GetString(readBuffer, 0, bytesRead));
                                                }
                                 
                                                Console.WriteLine("\r\nDone!\r\n");
                                            }
                                            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();
                                            }
                                        }
                                 
                                 
                                    }
                                }
                                Если устройство уже доступно как компорт - зачем более низоуровневый подход?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0621 ]   [ 17 queries used ]   [ Generated: 28.03.24, 12:31 GMT ]