На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА "Электроника и схемотехника"
В дополнение к основным ПРАВИЛАМ ФОРУМА :

1. Не забывайте указывать полное наименование, модель,марку, изготовителя и краткие характеристики оборудования.
2. Аргументируйте свое мнение - приводите развернутое высказывание или источник информации.
3. Запрещается обсуждать, размещать запросы и ссылки на схемы и оборудование
конфликтующие с законом или несущие явную потенциальную угрозу применения.
4. Не разрешается давать советы из разряда "Выкинь это старьё" и подобные.
5.Наглая реклама и самопиарщиана подлежит отстрелу сопровождаемому соответстующим наказанием
6.Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы.
Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
7.Запрещается создание тем, не относящиеся непосредственно к "Электронике и схемотехнике"
8.В этом разделе КАТЕГОРИЧЕСКИ запрещен мат во всех его проявлениях, а также: Ругань, оскорбления, переход на
личности.

Если Вы увидели нарушение правил раздела или форума, не поленитесь сообщить об этом модератору.
Участники форума, нарушающие правила, будут наказываться, а вносящие вклад в развитие форума - награждаться (DigiMoney и прочими радостями).


Приятного вам общения! ;)
  
> Проблемы при программировании считывателя. , Проблемы при программировании считывателя.
    Добрый день! Мне нужно запрограммировать считыватель никогда этого не делал и толком не знаю с чего начать.
    ExpandedWrap disabled
      using System;
      using System.IO.Ports;
      using System.Threading;
       
       
      namespace ComPortExample
      {
          class Program
          {
              static bool _continue;
              static SerialPort _serialPort;
              static void Main(string[] args)
              {
                  string name;
                  string message;
                  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;
       
                  // Set the read/write timeouts
                  _serialPort.ReadTimeout = 500;
                  _serialPort.WriteTimeout = 500;
       
                  _serialPort.Open();
                  _continue = true;
                  readThread.Start();
       
                  Console.Write("Name: ");
                  name = Console.ReadLine();
       
                  Console.WriteLine("Type QUIT to exit");
       
                  while (_continue)
                  {
                      message = Console.ReadLine();
       
                      if (stringComparer.Equals("quit", message))
                      {
                          _continue = false;
                      }
                      else
                      {
                          _serialPort.WriteLine(
                              String.Format("<{0}>: {1}", name, message));
                      }
                  }
       
                  readThread.Join();
                  _serialPort.Close();
              }
              public static void Read()
              {
                  while (_continue)
                  {
                      try
                      {
                          string message = _serialPort.ReadLine();
                          Console.WriteLine(message);
                      }
                      catch (TimeoutException) { }
                  }
              }
       
              // Display Port values and prompt user to enter a port.
              public static string SetPortName(string defaultPortName)
              {
                  string portName;
       
                  Console.WriteLine("Available Ports:");
                  foreach (string s in SerialPort.GetPortNames())
                  {
                      Console.WriteLine("   {0}", s);
                  }
       
                  Console.Write("Enter COM port value (Default: {0}): ", defaultPortName);
                  portName = Console.ReadLine();
       
                  if (portName == "" || !(portName.ToLower()).StartsWith("com"))
                  {
                      portName = defaultPortName;
                  }
                  return portName;
              }
              
          }
      }

    Выдает исключение: Время ожидания операции истекло.
    ExpandedWrap disabled
      catch (TimeoutException)


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

      А где можно почитать вопрос? Ну, или хотябы что Вам надо получить, и что Вы ожидаете от этого кода?
        Мне просто выдает ошибку, когда я пытаюсь считать данные с ком порта: "Время ожидания операции истекло.". Поэтому и спрашиваю что я делаю не так.

        Добавлено
        Я ж порт открываю с настройками и должен его прослушать.
          1. Убедитесь что устройство именно на 4 порту (например, на моём usb порте дефолтным был 232)
          2. Пробовали увеличивать время таймаута?

          Добавлено
          + я бы рекомендовал Вам переписать страшную часть с потоком, на адекватный евент, который за вас уже продумали авторы System.IO.Ports))

          ExpandedWrap disabled
            port = new SerialPort("COM" + portNumber.ToString(), 9600, Parity.None, 8, StopBits.One);
            port.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
             
            ...
            public void DataReceived(object sender, SerialDataReceivedEventArgs e) {
             Console.WriteLn(port.ReadLine());
            }


          хотя, я подозреваю, что именно эта часть у Вас реализована очень странно.

          Добавлено
          Чтобы было понятно, прежде чем считывать пришедшие данные, необходимо дождаться сообщения о том что пришёл стоповый бит. Как я понимаю, вы на это внимания не обращаете, и пытаетесь считать данные которые ещё не пришли, либо которых попросту нет, за время таймаута они так и не приходят, собственно, оттуда и ошибка.
          Сообщение отредактировано: VisualProg -
            Теперь мое приложение выглядит вот так:
            ExpandedWrap disabled
              using System;
              using System.IO.Ports;
              using System.Threading;
               
               
              namespace ComPortExample
              {
                  class Program
                  {
                      static bool _continue;
                      static SerialPort _serialPort;
                      
                      static void Main(string[] args)
                      {
                        
                        
                          
                          //StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
                          //Thread readThread = new Thread(Read);
               
                          // Create a new SerialPort object with default settings.
                          _serialPort = new SerialPort();
               
                          _serialPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
                          // Set the read/write timeouts
                          _serialPort.ReadTimeout = 2000;
                          _serialPort.WriteTimeout = 2000;
               
                          _serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
                          _serialPort.Open();
                        
                        
                          while(true)
                          {}
                          _serialPort.Close();
                      }
                      public static void DataReceived(object sender, SerialDataReceivedEventArgs e)
                      {
                        Console.WriteLine(_serialPort.ReadLine());
                        
                      }
                
                  }
              }


            Добавлено
            На консоль ничего не вывело.

            Добавлено
            Я в дипетчере устройств вижу USB serial port(COM4)
              ExpandedWrap disabled
                while(true)
                            {}


              Не делайте так. Вы посылаете все ресурсы на этот цикл, а ваш компонент порта не успевает ничего обработать...

              ExpandedWrap disabled
                    using System;
                    using System.IO.Ports;
                    using System.Threading;
                    
                    namespace ComPortExample
                    {
                        class Program
                        {
                        
                            private static bool       _continue;
                            private static SerialPort _serialPort;
                    
                            public static void Main(string[] args)
                            {
                 
                                _serialPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
                                _serialPort.ReadTimeout  = 1000;
                                _serialPort.WriteTimeout = 1000;
                                _serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
                                _serialPort.Open();
                 
                                    for(;;) {
                                        Thread.Sleep(200); // даём остальным потокам 200 миллисекунд на работу
                                    }
                                
                                _serialPort.Close(); // недостижимый код, но, для теста сойдёт
                            }
                            
                            private static void DataReceived(object sender, SerialDataReceivedEventArgs e) {
                                Console.WriteLine(_serialPort.ReadLine());
                            }
                    
                        }
                        
                    }


              Я вам рекомендую данную тему продолжать в разделе .NET/C# так как, это вопрос чисто программирования)
              Сообщение отредактировано: VisualProg -
                Цитата Dmitriy78781 @
                Мне нужно запрограммировать считыватель никогда этого не делал и толком не знаю с чего начать.

                Для начала неплохо считать что нить через Putty - чисто убедиться, что железяка рабочая. :rolleyes:

                Добавлено
                Цитата VisualProg @
                так как, это вопрос чисто программирования)

                это точно! :yes:
                  Что такое Putty.
                    Цитата Dmitriy78781 @
                    Что такое Putty.

                    Консоль, можно использовать для работы с ком-портом. Вот подробней: https://ru.wikipedia.org/wiki/PuTTY
                    Удобно что бы убедиться в правильности обращения с железякой. :)
                      А если я в PuTTY установил нужные настройки и ничего не произошло? Что это значит?
                        Цитата Dmitriy78781 @
                        А если я в PuTTY установил нужные настройки и ничего не произошло? Что это значит?


                        C Putty и бесплатного терминала и надо начинать. Выяснить работает ли железка, попробовать другую при возможности.
                          Родная программа есть?
                            Цитата
                            А если я в PuTTY установил нужные настройки и ничего не произошло? Что это значит?

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

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

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

                            Добавлено
                            + Вы до сих пор не объяснили что за устройство (Ваша фраза "у меня есть считыватель" даёт мне столько же информации сколько Вам моя фраза "у меня есть волшебная программа").
                            + Я как программист, никогда бы не начинал программу не зная протокола. В вашем случае - что вы ожидаете от устройства? Оно пингует то к чему подсоединено через COM порт? или же вы проводите манипуляции со считывателем и ожидаете данные? В обоих вариантах, надо знать протокол. Если вы потрудитесь его здесь описать, вашу проблему можно решить за 10 минут.
                              Цитата Dmitriy78781 @
                              А если я в PuTTY установил нужные настройки и ничего не произошло? Что это значит?

                              Не затруднит показать модель устройства?
                              Желательно и фотографию(что бы видно было как вы провода подкинули), в т.ч. переходника usb2com. :rolleyes:
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0475 ]   [ 15 queries used ]   [ Generated: 29.03.24, 14:03 GMT ]