На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Не могу достучаться до считывателя. , Не могу достучаться до считывателя.
    Купил считыватель, нужно его запрограммировать, никогда этого не делал и толком не знаю с чего начать, но кое что нашел в нете.
    Пример моей программы:
    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();
                                            }
                                        }
                                 
                                 
                                    }
                                }
                                Если устройство уже доступно как компорт - зачем более низоуровневый подход?
                                  Я как к ком порту достучатся не могу, но использую usb библиотеку я его хоть увидел.
                                    Проблемы при программировании считывателя.

                                    http://www.cyberforum.ru/csharp-beginners/thread1945239.html

                                    http://www.sql.ru/forum/1254609/ne-polucha...ya-s-komputerom

                                    Dmitriy78781 = dodik78781 = AlexNon = son456 :fool:

                                    Интересная формула получается :popcorn:
                                    Сообщение отредактировано: Кракозя -
                                      Достучался к usb и приходят данные:
                                      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.");
                                         
                                                        //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
                                        Dmitriy78781 А самому слабо что-нибудь сделать? Только тонны говнокодов постить по форумам?
                                        Скрытый текст
                                        user posted image
                                          Кракозя, у нас запрещено оскорблять участников. Если не можешь сказать что то по существу, не разводи флейм в тематических ветках.

                                          Цитата Кракозя @
                                          Данные 01-60

                                          Это не ответ вашего устройства. Ещё раз гляньте протокол, оно ответит либо 7 байт (ошибка), либо 12 (операция завершена успешно). Про два байта там информации нет.

                                          Добавлено
                                          В общем, попытайтесь определить, работает устройство или нет. Такое ощущение, что так упорно молчит оно не с проста...
                                            Дело в том что это устройство я открыть могу и даже послать данные, но получить не получается.
                                            Такая же ситуация с программой Terminal. Там я устанавливаю настройки, открываю порт, вижу что данные передаются(в строке состояния написано порт открыт, Тх постоянно меняется, но Rx постоянно ноль). Такая же ситуация если установить DTR, RTS.
                                              VisualProg, а где Вы, уважаемый, увидели оскорбление? Излагаются только факты просто космических :sarcasm: способностей данного субьекта, с целью показать бесполезность всех побуждений помочь. :popcorn:
                                                Дело в том что это устройство я открыть могу и даже послать данные, но получить не получается.
                                                Такая же ситуация с программой Terminal. Там я устанавливаю настройки, открываю порт, вижу что данные передаются(в строке состояния написано порт открыт, Тх постоянно меняется, но Rx постоянно ноль). Такая же ситуация если установить DTR, RTS.
                                                  Возможно что под windows7 x64 где-то стоит запрет на прием и передачу?
                                                    Цитата Dmitriy78781 @
                                                    Возможно что под windows7 x64 где-то стоит запрет на прием и передачу?

                                                    Переустанови винду, может поможет.
                                                      Цитата Dmitriy78781 @
                                                      Возможно что под windows7 x64 где-то стоит запрет на прием и передачу?

                                                      Вряд ли... обычно, ОС не рулит драйверами. (отключать их может, но, тогда бы вы не видели это устройство в диспетчере, даже не устройство, а то к чему оно подключено - будь то виртуальный USB/COM порт, или реальный). Сами посудите, это как блокировать один из пинов USB порта - не то что бессмысленно, даже, в некотором роде, потенциально опасно для компьютера. Проще заблокировать порт целиком, с его интерфейсом и забыть как с ним общаться - что и реализовано в ОС. Из двух вариантов - работает/не работает - в вашем случае, ОС даёт полноценную работу с устройством.

                                                      Цитата
                                                      Тх постоянно меняется, но Rx постоянно ноль


                                                      ИМХО, на стороне компьютера всё в рабочем состоянии. Тем более, если вы пользовались терминалом - сомнений остаться не должно. (Не доверять терминалу не вижу смысла)
                                                      Либо устройство не посылает ответ, либо что то ему мешает это сделать.

                                                      С подобным не сталкивался, поэтому сказать конкретно в чём дело не могу - тут всё зависит от вашего устройства.
                                                      Сообщение отредактировано: VisualProg -
                                                        Так как это устройство имеет драйвер FTDI, то я стал работать с ним, но тоже ничего не выдает.
                                                        ExpandedWrap disabled
                                                          using System;
                                                          using System.Collections.Generic;
                                                          using System.Linq;
                                                          using System.Text;
                                                          using System.Threading;
                                                           
                                                          using FTD2XX_NET;
                                                           
                                                          namespace ComPortConsole
                                                          {
                                                              class Program
                                                              {
                                                                  
                                                                  static void Main(string[] args)
                                                                  {
                                                                      UInt32 ftdiDeviceCount = 0;
                                                                      FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK;
                                                           
                                                                      // Create new instance of the FTDI device class
                                                                      FTDI myFtdiDevice = new FTDI();
                                                           
                                                                      // Determine the number of FTDI devices connected to the machine
                                                                      ftStatus = myFtdiDevice.GetNumberOfDevices(ref ftdiDeviceCount);
                                                                      // Check status
                                                                      if (ftStatus == FTDI.FT_STATUS.FT_OK)
                                                                      {
                                                                          //Console.WriteLine("Number of FTDI devices: " + ftdiDeviceCount.ToString());
                                                                          //Console.WriteLine("");
                                                                      }
                                                                      else
                                                                      {
                                                                          // Wait for a key press
                                                                          Console.WriteLine("Failed to get number of devices (error " + ftStatus.ToString() + ")");
                                                                          Console.ReadKey();
                                                                          return;
                                                                      }
                                                           
                                                                      // If no devices available, return
                                                                      if (ftdiDeviceCount == 0)
                                                                      {
                                                                          // Wait for a key press
                                                                          Console.WriteLine("Failed to get number of devices (error " + ftStatus.ToString() + ")");
                                                                          Console.ReadKey();
                                                                          return;
                                                                      }
                                                           
                                                                      // Allocate storage for device info list
                                                                      FTDI.FT_DEVICE_INFO_NODE[] ftdiDeviceList = new FTDI.FT_DEVICE_INFO_NODE[ftdiDeviceCount];
                                                           
                                                                      // Populate our device list
                                                                      ftStatus = myFtdiDevice.GetDeviceList(ftdiDeviceList);
                                                           
                                                                      /*if (ftStatus == FTDI.FT_STATUS.FT_OK)
                                                                      {
                                                                          for (UInt32 i = 0; i < ftdiDeviceCount; i++)
                                                                          {
                                                                              Console.WriteLine("Device Index: " + i.ToString());
                                                                              Console.WriteLine("Flags: " + String.Format("{0:x}", ftdiDeviceList[i].Flags));
                                                                              Console.WriteLine("Type: " + ftdiDeviceList[i].Type.ToString());
                                                                              Console.WriteLine("ID: " + String.Format("{0:x}", ftdiDeviceList[i].ID));
                                                                              Console.WriteLine("Location ID: " + String.Format("{0:x}", ftdiDeviceList[i].LocId));
                                                                              Console.WriteLine("Serial Number: " + ftdiDeviceList[i].SerialNumber.ToString());
                                                                              Console.WriteLine("Description: " + ftdiDeviceList[i].Description.ToString());
                                                                              Console.WriteLine("");
                                                                          }
                                                                      }*/
                                                           
                                                           
                                                                      // Open first device in our list by serial number
                                                                      ftStatus = myFtdiDevice.OpenBySerialNumber(ftdiDeviceList[0].SerialNumber);
                                                                      if (ftStatus != FTDI.FT_STATUS.FT_OK)
                                                                      {
                                                                          // Wait for a key press
                                                                          Console.WriteLine("Failed to open device (error " + ftStatus.ToString() + ")");
                                                                          Console.ReadKey();
                                                                          return;
                                                                      }
                                                           
                                                                      // Set up device data parameters
                                                                      // Set Baud rate to 9600
                                                                      ftStatus = myFtdiDevice.SetBaudRate(9600);
                                                                      if (ftStatus != FTDI.FT_STATUS.FT_OK)
                                                                      {
                                                                          // Wait for a key press
                                                                          Console.WriteLine("Failed to set Baud rate (error " + ftStatus.ToString() + ")");
                                                                          Console.ReadKey();
                                                                          return;
                                                                      }
                                                           
                                                                      // Set data characteristics - Data bits, Stop bits, Parity
                                                                      ftStatus = myFtdiDevice.SetDataCharacteristics(FTDI.FT_DATA_BITS.FT_BITS_8, FTDI.FT_STOP_BITS.FT_STOP_BITS_1, FTDI.FT_PARITY.FT_PARITY_EVEN);
                                                                      if (ftStatus != FTDI.FT_STATUS.FT_OK)
                                                                      {
                                                                          // Wait for a key press
                                                                          Console.WriteLine("Failed to set data characteristics (error " + ftStatus.ToString() + ")");
                                                                          Console.ReadKey();
                                                                          return;
                                                                      }
                                                                    
                                                                      // Set flow control - set RTS/CTS flow control
                                                                      ftStatus = myFtdiDevice.SetFlowControl(FTDI.FT_FLOW_CONTROL.FT_FLOW_RTS_CTS, 0x11, 0x13);
                                                                      if (ftStatus != FTDI.FT_STATUS.FT_OK)
                                                                      {
                                                                          // Wait for a key press
                                                                          Console.WriteLine("Failed to set flow control (error " + ftStatus.ToString() + ")");
                                                                          Console.ReadKey();
                                                                          return;
                                                                      }
                                                                      
                                                                      // Set read timeout to 5 seconds, write timeout to infinite
                                                                      ftStatus = myFtdiDevice.SetTimeouts(25, 25);
                                                                      if (ftStatus != FTDI.FT_STATUS.FT_OK)
                                                                      {
                                                                          // Wait for a key press
                                                                          Console.WriteLine("Failed to set timeouts (error " + ftStatus.ToString() + ")");
                                                                          Console.ReadKey();
                                                                          return;
                                                                      }
                                                                      // Сбросим входные и выходные буфера.
                                                                      ftStatus = myFtdiDevice.Purge(FTDI.FT_PURGE.FT_PURGE_TX);
                                                                      if (ftStatus != FTDI.FT_STATUS.FT_OK)
                                                                      {
                                                                          // Wait for a key press
                                                                          Console.WriteLine("Failed to set data characteristics (error " + ftStatus.ToString() + ")");
                                                                          Console.ReadKey();
                                                                          return;
                                                                      }
                                                                      ftStatus = myFtdiDevice.Purge(FTDI.FT_PURGE.FT_PURGE_RX);
                                                                      if (ftStatus != FTDI.FT_STATUS.FT_OK)
                                                                      {
                                                                          // Wait for a key press
                                                                          Console.WriteLine("Failed to set data characteristics (error " + ftStatus.ToString() + ")");
                                                                          Console.ReadKey();
                                                                          return;
                                                                      }
                                                                      // Perform loop back - make sure loop back connector is fitted to the device
                                                                      // Write string data to the device
                                                                      //string dataToWrite = "Hello world!";
                                                                      // ,0x10, 0x02, 0xC1, 0x05, 0x00, 0x02, 0x03, 0x0A, 0x00, 0x11, 0xf3
                                                                      //,     0x10,0x02,0xc3,0x00,0x11,0xe6
                                                                      byte[] dataToWrite = new byte[] { 0x10, 0x02, 0xc3, 0x00, 0x11, 0xe6 };
                                                           
                                                                      UInt32 numBytesWritten = 0;
                                                                      // Note that the Write method is overloaded, so can write string or byte array data
                                                                      ftStatus = myFtdiDevice.Write(dataToWrite, dataToWrite.Length, ref numBytesWritten);
                                                                      if (ftStatus != FTDI.FT_STATUS.FT_OK)
                                                                      {
                                                                          // Wait for a key press
                                                                          Console.WriteLine("Failed to write to device (error " + ftStatus.ToString() + ")");
                                                                          Console.ReadKey();
                                                                          return;
                                                                      }
                                                           
                                                           
                                                                      // Check the amount of data available to read
                                                                      // In this case we know how much data we are expecting,
                                                                      // so wait until we have all of the bytes we have sent.
                                                                      /*UInt32 numBytesAvailable = 0;
                                                                      do
                                                                      {
                                                                          ftStatus = myFtdiDevice.GetRxBytesAvailable(ref numBytesAvailable);
                                                                          if (ftStatus != FTDI.FT_STATUS.FT_OK)
                                                                          {
                                                                              // Wait for a key press
                                                                              Console.WriteLine("Failed to get number of bytes available to read (error " + ftStatus.ToString() + ")");
                                                                              Console.ReadKey();
                                                                              return;
                                                                          }
                                                                          Thread.Sleep(10);
                                                                      } while (numBytesAvailable < dataToWrite.Length);
                                                           
                                                                      // Now that we have the amount of data we want available, read it
                                                                      string readData;
                                                                      UInt32 numBytesRead = 0;
                                                                      // Note that the Read method is overloaded, so can read string or byte array data
                                                                      ftStatus = myFtdiDevice.Read(out readData, numBytesAvailable, ref numBytesRead);
                                                                      if (ftStatus != FTDI.FT_STATUS.FT_OK)
                                                                      {
                                                                          // Wait for a key press
                                                                          Console.WriteLine("Failed to read data (error " + ftStatus.ToString() + ")");
                                                                          Console.ReadKey();
                                                                          return;
                                                                      }
                                                                      Console.WriteLine(String.Format("{0:X}", readData));*/
                                                           
                                                           
                                                           
                                                           
                                                                      UInt32 numBytesAvailable = 0;
                                                                      string readData = "";
                                                                      while (true)
                                                                      {
                                                           
                                                                          
                                                                          UInt32 numBytesRead = 0;
                                                                          ftStatus = myFtdiDevice.GetRxBytesAvailable(ref numBytesAvailable);
                                                                          if (ftStatus != FTDI.FT_STATUS.FT_OK)
                                                                          {
                                                                              Console.WriteLine("Failed to get number of bytes available to read (error " + ftStatus.ToString() + ")");
                                                                              Console.ReadKey();
                                                                              break;
                                                                          }
                                                           
                                                                          readData = "";
                                                                          
                                                                          
                                                                          // Note that the Read method is overloaded, so can read string or byte array data
                                                                          ftStatus = myFtdiDevice.Read(out readData, numBytesAvailable, ref numBytesRead);
                                                           
                                                                          Console.WriteLine(String.Format("{0:X}", readData.ToString()));
                                                                          Console.ReadKey();
                                                                          Thread.Sleep(25); // Sleep 10 seconds.
                                                                          
                                                                      }
                                                                      
                                                                      
                                                                      
                                                           
                                                           
                                                           
                                                           
                                                                      // Close our device
                                                                      ftStatus = myFtdiDevice.Close();
                                                           
                                                                      // Wait for a key press
                                                                      Console.WriteLine("Press any key to continue.");
                                                                      Console.ReadKey();
                                                                      return;
                                                                  }
                                                              }
                                                          }
                                                          Цитата
                                                          using FTD2XX_NET;


                                                          Начиная с этой строчки, Ваш код уже "бесполезен" для читающего) Вряд ли кто то вкурсе что там у вас подключено...
                                                            Компания FTDI предоставляет на платформе Windows управляемый класс-обертку (managed .NET wrapper class) для функций FTD2XX DLL.
                                                            ExpandedWrap disabled
                                                              using FTD2XX_NET;

                                                            Здесь все есть:
                                                            http://microsin.net/programming/pc/ftdi-de...rom-csharp.html
                                                              Считаю свой вопрос в #15 всё ещё актуальным.

                                                              Устройство видно как компорт - вот с портом и разбираться надо, протокол в точности реализовать, адрес опять же правильный использовать. Постараться добыть родную программу.
                                                                Цитата
                                                                Устройство видно как компорт - вот с портом и разбираться надо

                                                                Полностью согласен
                                                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                0 пользователей:


                                                                Рейтинг@Mail.ru
                                                                [ Script execution time: 0,0935 ]   [ 17 queries used ]   [ Generated: 29.03.24, 01:36 GMT ]