9 / 1 / 0
Регистрация: 06.08.2018
Сообщений: 134
1

Получение данные с последовательного порта. SerialDataReceivedEventHandler

24.08.2020, 15:35. Показов 942. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые, Форумчане. Суть вопроса:
есть 2 формы. Из первой во второй я передаю serialport. Даже если я закрою соединение и открою его занового у меня не работает: SerialDataReceivedEventHandler.
Что мне хотелось бы узнать: 1). Есть ли способ получить данные с COM-порта не отсылая команду на сам порт. То есть может ли устройство первое начать связь с моим ПК. 2). Как сделать так чтобы наконец эта хрень заработала SerialDataReceivedEventHandler.

Мне нужно всего лишь чтобы эта ж...а реагировала на нажатие на кнопку на устройстве, мне не нужны ни данные ни что то еще, мне требуется только знать что да нажатие есть.

Если можете дайте пример. Хрень что описана на пабликах по программированию типа использовать white, делегаты и invoke я уже пробовал реакции ноль.

При нажатии на кнопку на устройстве ничего не происходит, то есть serialport.DataReceived += SerialDataReceivedEventHandler(DataReceived); не выполняется, хотя порт открыт, и при выполнении кода из формы то есть при нажатии на кнопку внутри программы все работает. И местами Open и DataReceived я менял, это также не дает результата. И еще раз уточню - мне не нужно читать данные, мне нужно просто знать что они пришли. Естественно мне требуется чтобы данное событие отслеживалось асинхронно, то есть не мешая работе основной формы, но при этом чтобы возвращало bool если пришли данные.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.08.2020, 15:35
Ответы с готовыми решениями:

20-40 выключателей в данные для последовательного порта
В электронике не разбираюсь, просто толкните в нужном направлении. Есть несколько кнопок - 20-30...

Как сохранить получение данные с ком порта в hex edit?
unit Unit70; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

приемник последовательного порта
как реализовывается приемник последовательного порта ???? и передатчик (= если не лень на...

Программирование последовательного порта
Добрый день, камрады. Не знаю в верный ли подраздел форума я обращаюсь! Прошу строго не судить! Но...

3
HF
972 / 639 / 160
Регистрация: 09.09.2011
Сообщений: 1,941
Записей в блоге: 2
24.08.2020, 23:05 2
Наконец-то вы решили про событие почитать и попробовать. Я считаю - более правильный путь.

Я не верю что ничего не приходит. Вы делали тест на простом коде? без всех этих ваших кнопок и циклов? Просто запуск формы, событие и ожидание. Если ваше внешнее устройство отправляет данные, то они будут приходить. Или вы что-то не то делаете.

Но это ваше желание - знать только "bool" - это всё равно "3 шага назад". Прочитать данные чтобы узнать были ли данные... и снова отправить запрос.

Добавлено через 5 минут
Пример простого теста: SerialPort.DataReceived Event

В интернете ещё обсуждают про правильную последовательность события и открытия. Но подтверждённых проблем вроде нет. Есть ещё установленные параметры порта и т.п. Вообщем есть что изучить или проверить.
0
9 / 1 / 0
Регистрация: 06.08.2018
Сообщений: 134
25.08.2020, 02:08  [ТС] 3
Такое я уже делал и изучил вопрос. Данные попадают в обработчик только когда я сам в форме отправляю запрос на получение данных. При отправке с устройства без участия формы не происходит ничего. Есть вероятность что у меня трудности с асинхронным и методами и потоками. Возможно данный обработчик необходимо перевести в другой поток. В тоже время. Ваш код я дополнил он стал работать
Проблема там оказалось в банальном хотя да не спал я очень долго прежде чем смог найти ошибку. Это целая повесть о моем изучении stream в итоге необходимо было увеличить просто напросто время чтения таймаут порта и нужно было сделать дополнительно задержку через Thread чтобы порт сам скинул соединение и продолжил бы чтение. То есть та форма которую Вы предоставили работает. Однако конечно я её дополнил. Но в тоже время для получения данных если данные отправляются с устройства без команд со стороны ПК ничего не происходит хотя сам терминал указывает что данные он отправил. Потеря также в потоке как я считаю но не могу отследить даже с отладчик ом где. Так как event не происходит как следствие обходит мимо точку останова

Добавлено через 2 минуты
Может у вас есть не то чтобы набросок а просто показать как я мог бы вызвать чтение в отдельном потоке Task.

Добавлено через 1 минуту
У меня просто вопрос такой. Если я вызову чтение асинхронно то выполнитсч ли команда что вы указывали для закрытия формы. Я конечно понимаю что её нужно реализовать через BeginInvoke однако как собрать воедино также не знаю

Добавлено через 55 минут
Тот метод что Вы указали для асинхронно го чтения я знаю что он стандартный я его встречал на просторах инета. Единственное что я думаю что ему требуется добавить IAsyncResult ar имею ввиду обработать его однако пока не понял как. Точнее не научился тому как это сделать. Если сможете подсказать как было бы круто. А так все же думаю что верно будет использовать 2 потока основной и через Task но могу ошибаться времени просто задержка уже большая

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

Добавлено через 2 минуты
Короче просто пока бьюсь с тем как соединить все вместе Task, DataReceived или его аналог через делегат и BeginInvoke

Добавлено через 13 минут
Что буду делать. По логике я думаю о следующем.
1. Создаю поток
2. Указываю внутри как вызываемый метод тот который вы указали
3. После внутри метода обрабатываю IAsyncResult через вызов его как делегата в BeginInvoke
Предположим все отработает правильно. Теперь меня по той же логике ну размышлению интересует как закрыть поток. Так как нет гарантии что при закрытии формы он прекратит свое существование. Я попробую то что предположил просто надо это сделать правильно хахах
0
9 / 1 / 0
Регистрация: 06.08.2018
Сообщений: 134
25.08.2020, 10:53  [ТС] 4
И еще хотелось бы уточнить, чтобы Вы понимали, трудность первая после того, как Вы показали форму и ее возможное решение состояло в потере потоков. Тут я думаю аналогичное, однако получалось так:
1. в случае передачи в другую форму было что мы первую половину передаем рабочую, а возвращаем нерабочую.
2. Теперь надо понимать что в случае basestream мы будем передавать рабочую, и обработать нам также требуется рабочую часть

Добавлено через 1 час 15 минут
А по поводу манулов всяких я их изучил ахах. В том и суть что я это не только читал но и пробовал а ещё даже понял. Однако пока вот результата нет
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2020, 10:53
Помогаю со студенческими работами здесь

Программирование последовательного порта.
Здраствуйте. Помогите кто чем может в поиске литературы, исходников по программированию...

Настройка последовательного порта
Добрый день. Возникла проблема с настройкой и, соответственно, использованием последовательного...

Мониторинг последовательного порта
Добрый день коллеги, работаю сейчас над проектом, где надо мониторить все устройства,...

Распределение данных с последовательного порта
Имеется такой код в VB6 Private Sub Command1_Click() MSComm1.CommPort = 2 MSComm1.Settings =...

Программирование кнопок с использованием последовательного порта
Здраствуйте! Мне нужно создать программу для контроля кнопок на геймпаде, используя...

Ищу снифер для последовательного порта
Имеется GSM модем, который подключён как виртуальный COMPort. Нужна прога для того, что бы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru