palraj001 Ответов: 1

Считывание веса с машины с помощью порта


Всем Привет,

Я использую этот код для считывания веса с весовой машины.

_serialPort = new SerialPort("COM2", 9600, Parity.None, 8);
   if (!_serialPort.IsOpen)
  {
     _serialPort.Open();
  }
  _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);

  txtQty.Text  = _serialPort.ReadExisting();
  if (_serialPort.IsOpen)
     {
        _serialPort.Close();
     }




Этот код работает нормально, когда я проверяю его с помощью точки останова. но не работает в exe. Иногда получение этого "доступа к порту 'COM2' отказано"

Как решить эту проблему ?

Sergey Alexandrovich Kryukov

Что такое "работа в exe". Нет такой вещи, как"работа без exe". Ты имеешь в виду, под управлением среды разработки vs отладчик против standalong?
--СА

AmitGajjar

SA, я думаю, что у palraj есть проблема с выпускной версией этого кода. как он уже упоминал, "прекрасно работает с beakpoint", он прекрасно работает в Visual Studio. я вижу только одну проблему-это проблема доступа из брандмауэра. ему нужно добавить 9600 в список разрешений брандмауэра.

OriginalGriff

Вы понимаете, что "9600" в конструкторе Serialport-это скорость передачи данных в Бодах, а не номер порта? И это никак не связано с брандмауэрами?

AmitGajjar

Ой.... к сожалению...

OriginalGriff

:смеяться:
Все совершают ошибки!

palraj001

Да. когда я отлаживаю код, он работает.

1 Ответов

Рейтинг:
2

OriginalGriff

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

Последовательные порты являются физическими коммуникационными устройствами - передача данных происходит не мгновенно. В вашем случае передача происходит со скоростью 9600 бит в секунду, что составляет около 960 символов в секунду. Вы не можете просто открыть порт, установить обработчик, прочитать данные и закрыть обработчик, потому что в реальном мире могут быть или не быть доступные данные, и если символ прибывает в приемник в неправильное время, обработчик события приема будет запущен и может быть выполнен после закрытия порта вашим образцом кода. Это может вызвать проблему, которую вы описываете.

Используйте событие обработчика для чтения данных.
И если вы собираетесь добавлять обработчик каждый раз, когда открываете порт, вам нужно удалять обработчик каждый раз, когда вы его закрываете!


SoMad

Отличный ответ +5.

Сорен Мадсен

Sergey Alexandrovich Kryukov

Это хороший момент, 5.
--СА

[no name]

Согласитесь, "работает в отладчике" - это очень расплывчато.
Я бы добавил, что вам нужно удалить обработчик перед close () (очевидно, я знаю) и прочитать это: https://msdn.microsoft.com/en-au/library/system.io.ports.serialport.close.aspx
"Лучшая практика для любого приложения-подождать некоторое время после вызова метода Close, прежде чем пытаться вызвать метод Open, так как порт не может быть закрыт мгновенно."
Это может привести к "отказу в доступе"