Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2013, 17:24   #21
alexusankov
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
...вообще-то, до 32-х устройств на одной шине без концентраторов, это адресов до 247. Но не суть.
Эммммм....

Raxp - CRC это чудесно, но вы обратите внимание на суть вопроса.
Суть вопроса - как мне считать 73 байта?
Нужно - отправить запрос, выждать секунду, и принять 73 байта. Все.
Поставленный вопрос - а вдруг не пришли 2 байта, идет как опровержение предложения "сидеть и ждать пока не придут 73 байта, читая их кол-во в DataRecieved".
Суть то проста - дать устройству секунду, и считать 73 байта.
Вариации, что не пришли некоторые байты, обрабатываются иначе, на одном участке стоит 12 устройств, для страховки, даже при отвале 11 девайсов, информацию, я получу.
Не дошли пару байтов? Не сошлась CRC? Да и хрен с ними, главное не задерживаться на одном устройстве дольше 1 секунды
P.s.s. слово "концентратор" - использовалось в другом смысле, нежели возможно поняли его ВЫ. Я так назвал блок управления

Последний раз редактировалось alexusankov; 01.12.2013 в 17:27.
alexusankov вне форума Ответить с цитированием
Старый 01.12.2013, 18:22   #22
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Ну поставьте жестко вшитую в код секунду ожидания.
Никто Вас не заставляет писать как "было бы хорошо" (событийная модель, четко поделенный код на оправителя, получателя, прием данных, парсер данных) - пишите как хотите.
По сабжу - все у Вас получится.
Кстати, мб просветите, откуда такой лимит "не задерживаться более 1 сек на одном девайсе"?
simples вне форума Ответить с цитированием
Старый 01.12.2013, 19:25   #23
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Вы TC читаете между строк. Считать 73 байта вам удасться в том случае, если придут 73 байта, а не придут, то и не примите, никогда. Ответ от запрашиваемого устройства может быть либо одним длинным пакетом, либо разбит на несколько, вот для этого и считается CRC (которая в Modbus-е присутствует жестко в составе пакета). Если CRC принятого вами пакета не совпадает, пакет не принят, и ваше жесткое ограничение в 73 байта на прием граничит с маразмом, длина пакетов может быть разная.

Цитата:
Не дошли пару байтов? Не сошлась CRC? Да и хрен с ними, главное не задерживаться на одном устройстве дольше 1 секунды
что подтверждает то, что вы не ходили по ссылке. Повторяю для непонятливых: не принят пакет в течении секунды, делаем повторный запрос или не делаем, раз вам горит, меняем адрес в пакете и шлем следующий. Какие проблемы.

Цитата:
P.s.s. слово "концентратор" - использовалось в другом смысле, нежели возможно поняли его ВЫ. Я так назвал блок управления
не знаю, что вы за смысл там вкладывали, надо называть модели сферических устройств и телепаты в отпуске. Но в контексте упомянутого вами RS-485 и Modbus все обстоит именно так, как я сказал и согласно стандарту.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 01.12.2013 в 19:31.
raxp вне форума Ответить с цитированием
Старый 04.12.2013, 10:29   #24
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Почему только мне бросилось в глаза
что после отправки сообщения порт закрывается?
Код:
  myPort.Open();
10|    myPort.Write(ask, 0, ask.Length);
11|    myPort.Close();
12|    Console.Read();
Все нормально с датаресивером, вешаете на него обработчик и обрабатываете момент когда данные поступают в приемный буфер.
Ждете секунду для уверенности и считываете пакет. затем его разбираете и принимаете решение стоит ли ждать еще данных или это конец посылки.

Порт открываете во время старта приложения и закрываете тогда когда приложение заканчивает работу. Это на случай если устройство шлет данные рандомно, необходимо оперативно оценивать ситуацию.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 04.12.2013, 11:47   #25
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...дык, в посту #5 для TC уже говорилось, что данные элементарно могут не успеть все прийти и их нужно ожидать в потоке.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 04.12.2013, 12:23   #26
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
...дык, в посту #5 для TC уже говорилось, что данные элементарно могут не успеть все прийти и их нужно ожидать в потоке.
ДатаРесивер сработает когда будут получены какие либо данные .. а секунду ждать уже с момента срабатывания.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 04.12.2013, 14:06   #27
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Некошерный вариант. Если запускать событие ожидания (считай поток, таймер) только с момента прихода данных, то проверка "неприхода" данных при отсутствии данных с одного из устройств никогда не будет запущена. Секунду следует ждать с момента отправки запроса.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 05.12.2013, 07:59   #28
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
Некошерный вариант. Если запускать событие ожидания (считай поток, таймер) только с момента прихода данных, то проверка "неприхода" данных при отсутствии данных с одного из устройств никогда не будет запущена. Секунду следует ждать с момента отправки запроса.
Это тонкости...
Ежу понятно что нужно делать цикл из нескольких попыток отправки. А приход контролировать по свойству ByteToReceive (Не помню как точно называется).
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 05.12.2013 в 08:01.
WorldMaster вне форума Ответить с цитированием
Старый 05.12.2013, 08:47   #29
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Это не просто тонкости, это главный нюанс. Есть большая разница между запуском контроля по приему и запуском контроля после передачи, это события разные и асинхронные.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Com port Эрвин1233 Visual C++ 1 29.06.2013 23:58
Банальное обновление программы. qwizz Общие вопросы Delphi 7 08.04.2013 09:44
ip:port Reglament_ Работа с сетью в Delphi 3 29.12.2011 18:50
com port чтение запись delphi SonicBob Помощь студентам 5 15.11.2011 10:20
Банальное равенство парсинга bulldog5293 Общие вопросы Delphi 2 29.03.2011 00:29