Периодическая запись и постоянное чтение COM порта

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
electrolab
interested
interested
Сообщения: 7
Зарегистрирован: 04 апр 2016, 22:49
Версия LabVIEW: 15
Контактная информация:

Периодическая запись и постоянное чтение COM порта

Сообщение electrolab »

Вчера я открыл это замечательное ПО. И начал с энтузиазмом его познавать) Почитал статьи вводные. Какие-то базовые понятие понял.

Задача - взаимодействие с микроконтроллером (МК).
На МК требуется отправить команду из 6 байт, обратно высылается телеметрия из 12 байт, которую нужно разобрать и отобразить (где-то байты, где-то отдельно биты вывести, где-то - группы бит).

Для начала я упростил задачу.
На МК отсылаются байты. При получении байта 0хАА МК зажигает светодиод и отправляет обратно байт 0х51. При получении любого другого байта - светодиод гасится, обратно высылается 0х52.
Ничего сообого короче - тестовая прошивка. Взаимодейтствие МК и компа происходит через RS-232 на скорости 9600 бод, с одним стоповым битом, без бита четности.

Сорганизовал отправку двух разных байт по кнопочкам - светодиод моргает, я счастлив.
Но вот с чтением никак. Я не понимаю почему. При добавлении чтения вообще и запись-то перестаёт работать.

Вот что я насобирал:
Безымянный.png
Помогите разобраться.
Почему на всех схемах все блоки visa соединяются последовательно? Корректно делать это так, как я сделал с блоками записи?
Аватара пользователя
ladik

Silver
developer
developer
Сообщения: 275
Зарегистрирован: 18 ноя 2014, 11:45
Награды: 1
Версия LabVIEW: 2015, 2019
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Периодическая запись и постоянное чтение COM порта

Сообщение ladik »

Последовательно, чтобы создать последовательность выполнения функций. У Вас же сейчас непонятно какой из кейсов выполнится в какое время. Данные на них поступают практически одновременно и выполнится может любой. Поэтому и не работает. Плюс у Вас нет задержки цикла и/или сдвигового регистра, где бы хранился приёмный буфер, т.о. даже если данные читаются - отображаются они короткое время, после чего пока буфер пуст, читать нечего и соот-но данных Вы не видите. Взгляните на пример, должен работать.
Вложения
Example.vi
(15.92 КБ) 353 скачивания
Дорогу осилит идущий.
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Периодическая запись и постоянное чтение COM порта

Сообщение Blackman »

Почему на всех схемах все блоки visa соединяются последовательно?
Название интерфейса - последовательный (serial): передача или прием байтов производится последовательно друг за другом.
Корректно делать это так, как я сделал с блоками записи?
Нет. Достаточно одной функции Write, в которую записывается команда ON (0xAA) или OFF(0xXX), после которой следует функция Read для чтения ответа (respond) МК - ON Ok (0x51) или OFF Ok (0x52).
Задавайте последовательность выполнения кода (Data Flow) при помощи проволок между терминалами error in и error out функций. Проверяйте ее на наличие ошибок после выпонения операции Write-Read.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Периодическая запись и постоянное чтение COM порта

Сообщение dadreamer »

ladik писал(а):Плюс у Вас нет задержки цикла
В принципе, можно и без задержки цикл крутить. Хотя, это зависит от архитектуры. VISA Read всё равно будет ожидать количество времени timeout, заданное при вызове VISA Configure Serial Port. Можно задать, скажем, timeout = 100 мс, и анализировать выход error out. Ну, вот, как здесь, например. Хотя и ваш вариант вполне себе ничего. :)
electrolab писал(а):На МК отсылаются байты. При получении байта 0хАА МК зажигает светодиод и отправляет обратно байт 0х51. При получении любого другого байта - светодиод гасится, обратно высылается 0х52.
Лучше, наверное, активировать Display Style, а то так они от строк визуально не отличимы. Просто как совет.
Вложения
2016-04-05_20-57-53.jpg
electrolab
interested
interested
Сообщения: 7
Зарегистрирован: 04 апр 2016, 22:49
Версия LabVIEW: 15
Контактная информация:

Re: Периодическая запись и постоянное чтение COM порта

Сообщение electrolab »

ladik, с наглядным примером осознал, спасибо.
Название интерфейса - последовательный (serial): передача или прием байтов производится последовательно друг за другом.
Последовательный - потому что по протоколу данные передаются бит за битом последовательно. RS-323 дуплексный интерфейс. Никто не запрещает мне передавать что-то на устройство и одновременно с этим в тот же момент времени принимать. Ну... по крайней мере в ПЛИСах это реализуется явно и я могу потоками "рулить". Но МК это ж программа уже, на ПК/LabView - тем более. Тяжело с ПЛИСовой паралелльности переключаться на последовательность)))

А вот ещё вопрос. Это получается с VISA Read я получаю строку - массив символов? Т.е. мне её надо будет для анализа разбить по паре символов, потом преобразовать в HEX/BIN, а потом уже как-то разряды вытягивать?
LabView - это короче учиться программировать надо заново :think:
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Периодическая запись и постоянное чтение COM порта

Сообщение Borjomy_1 »

Тяжело с ПЛИСовой паралелльности переключаться на последовательность)))
А и там никакой параллельности при работе с COM портом нет. Устройство одно и арбитраж в любом случае должен присутствовать. Два потока не могут (нет, вы можете заставить порт принимать данные параллельно из нескольких потоков, но этот вариант будет работать ненадежно, как минимум, а так будет вообще неработоспособен) передавать данные в один порт одновременно, как и принимать.
На :labview: вы вполне управляемо можете рулить потоками. Каждый цикл While и For оформляются как поток и способны выполняться параллельно.
принятый массив символов вы можете преобразовать в байтовый массив с помощью String To Byte Array. А байт в битовый массив.
electrolab
interested
interested
Сообщения: 7
Зарегистрирован: 04 апр 2016, 22:49
Версия LabVIEW: 15
Контактная информация:

Re: Периодическая запись и постоянное чтение COM порта

Сообщение electrolab »

А и там никакой параллельности при работе с COM портом нет. Устройство одно и арбитраж в любом случае должен присутствовать. Два потока не могут (нет, вы можете заставить порт принимать данные параллельно из нескольких потоков, но этот вариант будет работать ненадежно, как минимум, а так будет вообще неработоспособен) передавать данные в один порт одновременно, как и принимать.
Что значит нет? Как только я получал и идентифицировал первые байты в пришедней посылке я отправлял по RS232 ответный пакет. И какое-то время они успешно одновременно принимались и передавались, с т.з. ПЛИСа, конечно. А как там именно разруливалось на компе я, если честно, даже и не вдавался в подробности, но раз по факту все работало, на аппратном уровне hardware-драйвер же обеспечивал эту возможность значит. Или вы имеете ввиду уже уровень ОС? Ну, там, навреное, да, что-то буферизируется, как-то управляется.
А байт в битовый массив
Это с помощью Number To Boolean Array ?
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Периодическая запись и постоянное чтение COM порта

Сообщение Borjomy_1 »

Что значит нет?
Представьте себе ситуацию, когда два потока отправляют по строке в 10байт ОДНОВРЕМЕННО в один порт. Сможете внятно пояснить, что получится на выходе?
Это с помощью Number To Boolean Array ?
Да
Udp в верхний цикл желательно вставить задержку, как минимум на 50мс
Вложения
Передача по порту.png
Передача по порту.vi
(16.59 КБ) 181 скачивание
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Периодическая запись и постоянное чтение COM порта

Сообщение Blackman »

Последовательный - потому что по протоколу данные передаются бит за битом последовательно.
Что бы было понятно! Последовательный интерфейс (VISA Serial Class) потому что, именно байт за байтом, как при передаче, так и при приеме. Единица информации 1 байт. Поэтому и параллельный порт тоже относится к последовательному интерфейсу. А как на физическом уровне протокола реализуется передача или прием этого байта, это другая тема и на уровне VISA драйвера не имеет значения.
electrolab
interested
interested
Сообщения: 7
Зарегистрирован: 04 апр 2016, 22:49
Версия LabVIEW: 15
Контактная информация:

Re: Периодическая запись и постоянное чтение COM порта

Сообщение electrolab »

Доброго времени суток.
Приблизил модель к более реальной. Теперь отправляется два байта. При отправке двух определённых байт МК возвращает тоже 2 байта. Чтобы VISA Read не тупил, ожидая эти два байта, когда их нет сделал селектор для размера буфера для VISA Read.
И вот теперь я получаю два байта как и положено. Хочу снача вывести их по отдельности. Потом - вывести несколько бит или группу бит из одного из байта.

По идее, мне надо сначал преобразовать строку, полученную с VISA Read в массив байт, а потом из массива выдернуть эту пару байт, преобразовать их в число и выдада на индикатор, который настроен на цифровое отображение беззнакового восьмиразрядного числа.
Не могу понять как засунуть байты в массив - нужен какой-то счётчик для индекса массива? Который еще к тому же и сбрасывать нужно будет при получении новой посылки. И непонятно как из массивы "вынуть" нужный элемент - это какой инструмент мне нужно использовать - Index Array? Но потом полученный элемент массива нужно как-то еще преобразовывать же, потому что он же "array"?
Example.vi
(17.03 КБ) 172 скачивания
Аватара пользователя
ladik

Silver
developer
developer
Сообщения: 275
Зарегистрирован: 18 ноя 2014, 11:45
Награды: 1
Версия LabVIEW: 2015, 2019
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Периодическая запись и постоянное чтение COM порта

Сообщение ladik »

Взгляните.
Вложения
Пример.png
Пример.png (15.69 КБ) 14121 просмотр
Пример.vi
(8.04 КБ) 192 скачивания
Дорогу осилит идущий.
electrolab
interested
interested
Сообщения: 7
Зарегистрирован: 04 апр 2016, 22:49
Версия LabVIEW: 15
Контактная информация:

Re: Периодическая запись и постоянное чтение COM порта

Сообщение electrolab »

С преобразованием на вывод разобрался.
Получилось вывести байт, бит из байта, 3 бита из байта. Класс!)
Спасибо за помощь!

Теперь я решил научиться так же задавать команды.
Сделал ввод байта команды "руками" - в текстовое поле. И 8 тумблеров - биты второго байта. С этих булевых значений я собираю булевый массив, преобразую его в число, число - в строку, объединяю строку с отдельно введенной и засовываю на буфер VISA Write. Но вот засада... насколько я понял, у меня происходит преобразование числа не в HEX, а в ASCII код цифр числа. Непонимаю как мне преобразовать именно в байт всё. Мне надо отправить два байта: AA и BB. С AA проблем нет, т.к. я значения забиваю в текстовое поле, настроенное по умолчанию в HEX. А вот как мне BB получить непонимаю...

ladik, у меня два вопроса)
1) Как у вы сделали Boolean Array? Это инструмент/функция такая? Просто я что-то не нашел ничего подобного.
2) На самой вашей первой схеме, над которой я и опыты ставлю есть два сдвиговых регистра (Shift Register), встроенные в контур While Loop и подсоединные к самому верхнему мультиплексору Select. При этом еще есть и точка соединения с Case Structure. А зачем это всё?

Кстати, а как присоединять вложения vi, что бы ещё и картинка показывалась?)
Example.vi
(23.76 КБ) 179 скачиваний
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Периодическая запись и постоянное чтение COM порта

Сообщение dadreamer »

electrolab писал(а):насколько я понял, у меня происходит преобразование числа не в HEX, а в ASCII код цифр числа. Непонимаю как мне преобразовать именно в байт всё.
2016-04-21_0-02-02.jpg
2016-04-21_0-02-21.jpg
2016-04-21_0-02-21.jpg (19.75 КБ) 14090 просмотров
electrolab писал(а):1) Как у вы сделали Boolean Array? Это инструмент/функция такая? Просто я что-то не нашел ничего подобного.
ПКМ на входе/выходе -> Create -> Control / Indicator
electrolab писал(а):Кстати, а как присоединять вложения vi, что бы ещё и картинка показывалась?)
Если вы о диаграммах :vi: , то либо делаете скриншот и вставляете как простое вложение, либо делаете сниппет и так же вставляете сюда:
zXtK6BGqz-k
Аватара пользователя
ladik

Silver
developer
developer
Сообщения: 275
Зарегистрирован: 18 ноя 2014, 11:45
Награды: 1
Версия LabVIEW: 2015, 2019
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Периодическая запись и постоянное чтение COM порта

Сообщение ladik »

На первый вопрос Вам ответили. Отвечаю на второй. Хотя ответ там дан в качестве комментария: "Если ничего не принимается или есть ошибка приёмо-передачи LastMsg не обновляется". В цикле есть только ОДИН сдвиговый регистр, в нём хранится принимаемое сообщение. В случае, если при передаче/приёме была ошибка, сообщение не обновляется - на селекторе True. Ошибки нет - False, приёмный буфер попадает в сдвиговый регистр. Чтобы сообщение не затиралось, когда не ведётся работа с портом, оно просто крутится в регистре - кейс False отправляет его на селектор.
Дорогу осилит идущий.
electrolab
interested
interested
Сообщения: 7
Зарегистрирован: 04 апр 2016, 22:49
Версия LabVIEW: 15
Контактная информация:

Re: Периодическая запись и постоянное чтение COM порта

Сообщение electrolab »

Ага, спасибо, получилось всё с вводом)
ПКМ на входе/выходе -> Create -> Control / Indicator
Так а как сделать именно массив? Там еще и орагны управления - типа биты можно сдвигать...
Пытался все выделить и что-то сделать - что-то не получается...
На первый вопрос Вам ответили. Отвечаю на второй. Хотя ответ там дан в качестве комментария: "Если ничего не принимается или есть ошибка приёмо-передачи LastMsg не обновляется". В цикле есть только ОДИН сдвиговый регистр, в нём хранится принимаемое сообщение. В случае, если при передаче/приёме была ошибка, сообщение не обновляется - на селекторе True. Ошибки нет - False, приёмный буфер попадает в сдвиговый регистр. Чтобы сообщение не затиралось, когда не ведётся работа с портом, оно просто крутится в регистре - кейс False отправляет его на селектор.
Это-то я понял. Я не понял зачем это все было привязывать к "границам" Можно же было просто ноль повесить на один вход селектора и все. Что мне непонятно - смотрите на картинке ниже, я там красным обвёл.
Untitled-21.jpg
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приборами»