|
1 / 1 / 0
Регистрация: 24.12.2014
Сообщений: 14
|
||||||
SerialPort получение и отправка данных07.11.2023, 11:27. Показов 991. Ответов 10
Метки нет (Все метки)
Здравствуйте!
Суть проблемы, есть электрооборудование, которое подключено к комьютеру по интерфейсу RS485. Устройство необходимо постоянно мониторить, для этого на устройство нужно отправить команду и получить ответ от устройства. Таких команд (различных) множество, в данный момент 39шт. Проблемы как таковой не существовало, пока запросы были одиночные, т.е. отправил один запрос - получил один ответ. С отправкой множества команд возникли сложности, я создаю массив исходных команд, далее создаю цикл в котором я перебираю значения массива и формирую пакет для отправки. Дальше начинаются сложности, идея была такая: в цикле перебора массива, итарация первая i=0 - отправляю первое значение массива в компорт, получаю первый ответ из компорта, записываю его в массив входящих данных, инкремент i++, далее следующая итерация цикла. Но так, конечно же, не работает. Я не понимаю как считать и записать данные в ходе цикла, т.к. они приходят в событии DataReceived, которым я никак не управляю. Полный перебор цикла отправляет 39 пакетов в компорт не дожидаясь ответа, оборудование успевает что-то попытаться ответить и зависает. Единственное, что пришло на ум, добавить зедержку по времени, для того чтобы чтение успело пройти thread.sleep(500); но пока я это решение не успел протестировать. Что-то я конкретно запутался, прошу помощи.
0
|
||||||
| 07.11.2023, 11:27 | |
|
Ответы с готовыми решениями:
10
Метод Post, получение данных со страницы и отправка Получение капчи с сайта и отправка данных в форму на сайте |
|
|
|||
| 07.11.2023, 11:44 | |||
DataReceived. Но может быть такое, что устройство не ответило (мало ли что, там, неверная команда или данные побились...). Тогда отправка новых команд должна происходить по некоему таймауту, по таймеру.Добавлено через 3 минуты
0
|
|||
|
1 / 1 / 0
Регистрация: 24.12.2014
Сообщений: 14
|
||
| 07.11.2023, 11:51 [ТС] | ||
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 07.11.2023, 11:56 | |
|
NSluggard, а протокол-то как называется?
0
|
|
|
1 / 1 / 0
Регистрация: 24.12.2014
Сообщений: 14
|
|
| 07.11.2023, 12:00 [ТС] | |
|
System Power Monitoring Protocol
0
|
|
|
1 / 1 / 0
Регистрация: 24.12.2014
Сообщений: 14
|
|
| 07.11.2023, 12:31 [ТС] | |
|
wizard41, спасибо за наводку. Если не затруднит, можете какой-то пример прислать?
Я правильно понял, что событие нужно в DataReceived вызывать? Типа if глобальный счетчик? Крайне интересная мысль. Если я правильно понял, пример наверное не нужен. А почему массив выбран неудачно?
0
|
|
|
|
|||||||||||||||||||||||||||
| 07.11.2023, 12:58 | |||||||||||||||||||||||||||
Сообщение было отмечено NSluggard как решение
Решение
Т.е. после каждой отправки мы сдвигаемся на одну команду вперед, пока не дойдем до конца списка. После чего начинается все сначала. Пока не выключим флаг передачи. Если ответа от устройства не будет, то передачи не произойдет. Вот тут нужен таймер, чтобы в этом случае по нему отправить очередную посылку... И еще - не проработан вопрос гарантии полноценного приема. Ответ от устройства может приходить "рваным", т.е. весь пакет может прийти и в двух ответах. Но это уже другая песня..
1
|
|||||||||||||||||||||||||||
|
1 / 1 / 0
Регистрация: 24.12.2014
Сообщений: 14
|
|
| 07.11.2023, 23:47 [ТС] | |
|
wizard41, огромное спасибо за помощь, заработало!
По поводу отсутствия ответа и таймера на проверку я понял, примерно так и думал. По поводу рваного ответа тоже думал проверку поставить на контрольную сумму и таймаут на ожидание ответа, правда из-за таймаута скорость упадёт. Я так понял, что в рваных пекетах может скрываться другая угроза, типа коллизии, я когда ранее тестил неправильную отправку запросов хорошо подвесил несколько раз устройство.
1
|
|
|
|
|||
| 08.11.2023, 13:16 | |||
|
При посылках переменной длины используется терминатор (один из способов) - некий символ, означающий конец пакета. Соответственно, принимать данные пока не встретится этот символ. Для устройства, как можешь видеть, этот терминатор есть в конце всех команд - "0x0D". По нему устройство "понимает" что хорош, вся пачка нужной длины получена. Т.о. в зависимости от конкретной ситуации, тебе нужно реализовать это одним из приведенных способов, чтобы быть более уверенным в целостности принимаемых данных.
1
|
|||
| 08.11.2023, 13:16 | |
|
Помогаю со студенческими работами здесь
11
Отправка и получение данных по UDP Отправка и получение данных TCP Получение данных с SerialPort после запроса Отправка данных с формы и получение данных с базы
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
|
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит значение перечислений.
/ / Событие "НачалоВыбора" реквизита на форме. . .
|