Проблема с приемом данных в произвольные моменты времени
-
- beginner
- Сообщения: 10
- Зарегистрирован: 16 фев 2010, 02:04
- Версия LabVIEW: 8.5
- Контактная информация:
Проблема с приемом данных в произвольные моменты времени
Здравствуйте!
Есть следующая система: ПК -> USB-UART -> Микроконтроллер Atmega32
Без проблем получается средствами VISA передавать данные с ПК на МК и обратно, НО:
Есть необходимость в ПРОИЗВОЛЬНЫЕ моменты времени принимать посылки от МК, то есть хотелось бы в программе на LabVIEW организовать прерывания в моменты, когда МК отправляет данные. Программа на ПК должна как-то понять, что МК отправляет данные и только тогда запускать функцию Read.
В теме не очень давно, ковыряюсь уже неделю, не выходит. Подскажите, пожалуйста, кто знает, как решить проблему.
Есть следующая система: ПК -> USB-UART -> Микроконтроллер Atmega32
Без проблем получается средствами VISA передавать данные с ПК на МК и обратно, НО:
Есть необходимость в ПРОИЗВОЛЬНЫЕ моменты времени принимать посылки от МК, то есть хотелось бы в программе на LabVIEW организовать прерывания в моменты, когда МК отправляет данные. Программа на ПК должна как-то понять, что МК отправляет данные и только тогда запускать функцию Read.
В теме не очень давно, ковыряюсь уже неделю, не выходит. Подскажите, пожалуйста, кто знает, как решить проблему.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Проблема с приемом данных в произвольные моменты времени
А что насчет коллизии, когда вы отправили данные с ПК на МК, а в этот момент МК захочет отправить свою посылку?
Правильнее реализовать опрос МК по состоянию готовности данных. И тогда, при приходе готовности, запрашивать данные с МК. Готовность, кстати можно выдавать не сразу, а в течение какого-то времени, например 100мс. В течение этого времени либо досрочно приходит ответ от МК, что данные готовы, либо по истечению таймаута приходит ответ, что данные не готовы. Программу приема в LV настроить на таймаут 150мс. Тогда по выходу из этой задачи вы сможете отправить свои команды. А контроллер уже не сможет отправлять данные самостоятельно, когда вы производите обмен.
Сейчас у вас при двунаправленном обмене получается два инициатора. Это неправильно, никогда работать не будет нормально. Обычно контроллер делают подчиненным устройством, которое выдает информацию только по запросу.
Правильнее реализовать опрос МК по состоянию готовности данных. И тогда, при приходе готовности, запрашивать данные с МК. Готовность, кстати можно выдавать не сразу, а в течение какого-то времени, например 100мс. В течение этого времени либо досрочно приходит ответ от МК, что данные готовы, либо по истечению таймаута приходит ответ, что данные не готовы. Программу приема в LV настроить на таймаут 150мс. Тогда по выходу из этой задачи вы сможете отправить свои команды. А контроллер уже не сможет отправлять данные самостоятельно, когда вы производите обмен.
Сейчас у вас при двунаправленном обмене получается два инициатора. Это неправильно, никогда работать не будет нормально. Обычно контроллер делают подчиненным устройством, которое выдает информацию только по запросу.
-
IvanLis
- guru
- Сообщения: 5464
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Проблема с приемом данных в произвольные моменты времени
Тут проблема скорее в другом, но нужно смотреть код программы.MONSTR писал(а):Есть необходимость в ПРОИЗВОЛЬНЫЕ моменты времени принимать посылки от МК, то есть хотелось бы в программе на LabVIEW организовать прерывания в моменты, когда МК отправляет данные. Программа на ПК должна как-то понять, что МК отправляет данные и только тогда запускать функцию Read.
В теме не очень давно, ковыряюсь уже неделю, не выходит. Подскажите, пожалуйста, кто знает, как решить проблему.
Скорее всего в одном цикле организован прием данных, их обработка и что-нибудь еще.
А по хорошему все это необходимо разносить по разным, асинхронно работающим циклам.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- beginner
- Сообщения: 10
- Зарегистрирован: 16 фев 2010, 02:04
- Версия LabVIEW: 8.5
- Контактная информация:
Re: Проблема с приемом данных в произвольные моменты времени
Обмен данными между ПК и МК именно так и реализован - по запросу от ПК. Передача посылки от МК в произвольный момент предполагается сделать при нештатной ситуации. То есть - когда отрубается питание у МК, или он сбрасывается от помехи и т.п. - когда МК заново включается он первым делом должен отправитьСейчас у вас при двунаправленном обмене получается два инициатора. Это неправильно, никогда работать не будет нормально. Обычно контроллер делают подчиненным устройством, которое выдает информацию только по запросу.
на ПК значение своего регистра, в котором установлен флаг, соответствующий причине его перезагрузки. То есть предсказать момент нельзя.
Так нечего пока смотреть - не знаю как реализовать. Пока сделан обмен данными по запросу ПК, а как инициировать приём данных компьютером "по желанию" МК (без предварительного запроса от ПК) - не знаю.Тут проблема скорее в другом, но нужно смотреть код программы.
Скорее всего в одном цикле организован прием данных, их обработка и что-нибудь еще.
А по хорошему все это необходимо разносить по разным, асинхронно работающим циклам.
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: Проблема с приемом данных в произвольные моменты времени
Вынесите опрос статусных регистров в отдельный поток и проверяйте их состояние самостоятельно каждую секунду например.То есть - когда отрубается питание у МК, или он сбрасывается от помехи и т.п. - когда МК заново включается он первым делом должен отправить на ПК значение своего регистра, в котором установлен флаг, соответствующий причине его перезагрузки.
Или это будет противоречить Вашему протоколу обмена данными с контроллером?
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
- beginner
- Сообщения: 10
- Зарегистрирован: 16 фев 2010, 02:04
- Версия LabVIEW: 8.5
- Контактная информация:
Re: Проблема с приемом данных в произвольные моменты времени
Нет, не противоречит, протокол сами придумываем, учимся, изобретаем свой велосипед Видимо так и придётся делать, как Вы говорите.Вынесите опрос статусных регистров в отдельный поток и проверяйте их состояние самостоятельно каждую секунду например.
Или это будет противоречить Вашему протоколу обмена данными с контроллером?
Просто хотел узнать - возможно ли принципиально сделать приём данных именно "по желанию" МК, есть ли какой-то признак, который сообщал бы программе на LabVIEW, что вот она - посылка от МК пожаловала, надо её принять! или же это принципиально не возможно в нашем случае..
-
IvanLis
- guru
- Сообщения: 5464
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Проблема с приемом данных в произвольные моменты времени
Я Вам про это и говорил.MONSTR писал(а):Просто хотел узнать - возможно ли принципиально сделать приём данных именно "по желанию" МК, есть ли какой-то признак, который сообщал бы программе на LabVIEW, что вот она - посылка от МК пожаловала, надо её принять! или же это принципиально не возможно в нашем случае..
Для приема данных организуете отдельный цикл. Настраиваете окончание приема посылки по "терминатору". А МК соответственно этим терминатором оканчивает посылку. Когда посылка принята, она передается в другой цикл (для этого как правило используются очередь - Queue).
В цикле обработки принятый пакет разбирается (в заголовке пакета можно указать что с ним делать, т.е. определить "правила") и потом уже в зависимости от "правила" обрабатывается тем или иным способом.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- beginner
- Сообщения: 10
- Зарегистрирован: 16 фев 2010, 02:04
- Версия LabVIEW: 8.5
- Контактная информация:
Re: Проблема с приемом данных в произвольные моменты времени
Может я чего-то не понял, но всё же.Я Вам про это и говорил.
Для приема данных организуете отдельный цикл. Настраиваете окончание приема посылки по "терминатору". А МК соответственно этим терминатором оканчивает посылку. Когда посылка принята, она передается в другой цикл (для этого как правило используются очередь - Queue).
В цикле обработки принятый пакет разбирается (в заголовке пакета можно указать что с ним делать, т.е. определить "правила") и потом уже в зависимости от "правила" обрабатывается тем или иным способом.
Вы говорите о завершении приёма данных и дальнейшей их обработке. С этим всё ясно. Меня же интересует начало приёма данных, а именно - как сделать так, чтобы программа на ПК начинала приём именно тогда, когда МК их будет передавать без запроса со стороны ПК.
А как программа перейдёт в этот цикл, именно тогда, когда МК отправляет посылку?Для приема данных организуете отдельный цикл.
-
IvanLis
- guru
- Сообщения: 5464
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Проблема с приемом данных в произвольные моменты времени
Это реализуется не Вами и не в LabVIEW, порт постоянно находится в ожидании. Если Вам интересны механизмы, то можете почитать самостоятельно.MONSTR писал(а):Меня же интересует начало приёма данных, а именно - как сделать так, чтобы программа на ПК начинала приём именно тогда, когда МК их будет передавать без запроса со стороны ПК.
Это уже больше от Вас зависит, можно поставить бесконечное (-1) время ожидания данных.MONSTR писал(а):А как программа перейдёт в этот цикл, именно тогда, когда МК отправляет посылку?
Так что цикл запуститься только когда данные будут приняты, т.е. принят "терминатор". Все данные которые были получены до терминатора будут в одном пакете.
После этого цикл будет перезапускаться и ждать следующий "терминатор".
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Проблема с приемом данных в произвольные моменты времени
Получается все проще - перед посылкой команды проверять наличие в буфере посылки. Так как вы эти данные не заказывали, то это "последний выдох".
-
- beginner
- Сообщения: 10
- Зарегистрирован: 16 фев 2010, 02:04
- Версия LabVIEW: 8.5
- Контактная информация:
Re: Проблема с приемом данных в произвольные моменты времени
Borjomy_1, а объясните, пожалуйста, немного подробнее - как это сделать - всегда проверять значения в "Bytes at port" или использовать функцию ожидания события?
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Проблема с приемом данных в произвольные моменты времени
Перед операцией запроса производить проверку "Bytes at port". Но все равно метод является извращением. Какая вам разница, узнали ли вы о том, что контроллер выключился, сейчас, или на 100мс позже? Все равно с ним ничего сделать не удастся. Поэтому ОБЫЧНО устройства просто опрашивают с некоторым интервалом. Наступление таймаута однозначно указывает от отваливание контроллера (таймаут не обязательно делать 10сек, как по умолчанию. Достаточно удвоенного максимального времени обмена). Также это и диагностирует пропадание связи. Ваше решение при пропадании связи не работает и вы можете узнать об этом, только послав команду, т.е. это будет действительно слишком поздно.
-
- beginner
- Сообщения: 10
- Зарегистрирован: 16 фев 2010, 02:04
- Версия LabVIEW: 8.5
- Контактная информация:
Re: Проблема с приемом данных в произвольные моменты времени
Благодарю всех за советы! Решение приняли. Инициатор всегда будет ПК.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 13 Ответы
- 1224 Просмотры
-
Последнее сообщение Boxa
-
- 1 Ответы
- 500 Просмотры
-
Последнее сообщение alerm
-
- 3 Ответы
- 872 Просмотры
-
Последнее сообщение IvanLis
-
- 0 Ответы
- 502 Просмотры
-
Последнее сообщение Juri
-
- 3 Ответы
- 272 Просмотры
-
Последнее сообщение AndreyDmitriev