Периодическая запись и постоянное чтение COM порта
-
- interested
- Сообщения: 7
- Зарегистрирован: 04 апр 2016, 22:49
- Версия LabVIEW: 15
- Контактная информация:
Периодическая запись и постоянное чтение COM порта
Вчера я открыл это замечательное ПО. И начал с энтузиазмом его познавать) Почитал статьи вводные. Какие-то базовые понятие понял.
Задача - взаимодействие с микроконтроллером (МК).
На МК требуется отправить команду из 6 байт, обратно высылается телеметрия из 12 байт, которую нужно разобрать и отобразить (где-то байты, где-то отдельно биты вывести, где-то - группы бит).
Для начала я упростил задачу.
На МК отсылаются байты. При получении байта 0хАА МК зажигает светодиод и отправляет обратно байт 0х51. При получении любого другого байта - светодиод гасится, обратно высылается 0х52.
Ничего сообого короче - тестовая прошивка. Взаимодейтствие МК и компа происходит через RS-232 на скорости 9600 бод, с одним стоповым битом, без бита четности.
Сорганизовал отправку двух разных байт по кнопочкам - светодиод моргает, я счастлив.
Но вот с чтением никак. Я не понимаю почему. При добавлении чтения вообще и запись-то перестаёт работать.
Вот что я насобирал: Помогите разобраться.
Почему на всех схемах все блоки visa соединяются последовательно? Корректно делать это так, как я сделал с блоками записи?
Задача - взаимодействие с микроконтроллером (МК).
На МК требуется отправить команду из 6 байт, обратно высылается телеметрия из 12 байт, которую нужно разобрать и отобразить (где-то байты, где-то отдельно биты вывести, где-то - группы бит).
Для начала я упростил задачу.
На МК отсылаются байты. При получении байта 0хАА МК зажигает светодиод и отправляет обратно байт 0х51. При получении любого другого байта - светодиод гасится, обратно высылается 0х52.
Ничего сообого короче - тестовая прошивка. Взаимодейтствие МК и компа происходит через RS-232 на скорости 9600 бод, с одним стоповым битом, без бита четности.
Сорганизовал отправку двух разных байт по кнопочкам - светодиод моргает, я счастлив.
Но вот с чтением никак. Я не понимаю почему. При добавлении чтения вообще и запись-то перестаёт работать.
Вот что я насобирал: Помогите разобраться.
Почему на всех схемах все блоки visa соединяются последовательно? Корректно делать это так, как я сделал с блоками записи?
-
ladik
- developer
- Сообщения: 275
- Зарегистрирован: 18 ноя 2014, 11:45
- Награды: 1
- Версия LabVIEW: 2015, 2019
- Откуда: Екатеринбург
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Периодическая запись и постоянное чтение COM порта
Последовательно, чтобы создать последовательность выполнения функций. У Вас же сейчас непонятно какой из кейсов выполнится в какое время. Данные на них поступают практически одновременно и выполнится может любой. Поэтому и не работает. Плюс у Вас нет задержки цикла и/или сдвигового регистра, где бы хранился приёмный буфер, т.о. даже если данные читаются - отображаются они короткое время, после чего пока буфер пуст, читать нечего и соот-но данных Вы не видите. Взгляните на пример, должен работать.
- Вложения
-
- Example.vi
- (15.92 КБ) 354 скачивания
Дорогу осилит идущий.
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Периодическая запись и постоянное чтение COM порта
Название интерфейса - последовательный (serial): передача или прием байтов производится последовательно друг за другом.Почему на всех схемах все блоки visa соединяются последовательно?
Нет. Достаточно одной функции Write, в которую записывается команда ON (0xAA) или OFF(0xXX), после которой следует функция Read для чтения ответа (respond) МК - ON Ok (0x51) или OFF Ok (0x52).Корректно делать это так, как я сделал с блоками записи?
Задавайте последовательность выполнения кода (Data Flow) при помощи проволок между терминалами error in и error out функций. Проверяйте ее на наличие ошибок после выпонения операции Write-Read.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Периодическая запись и постоянное чтение COM порта
В принципе, можно и без задержки цикл крутить. Хотя, это зависит от архитектуры. VISA Read всё равно будет ожидать количество времени timeout, заданное при вызове VISA Configure Serial Port. Можно задать, скажем, timeout = 100 мс, и анализировать выход error out. Ну, вот, как здесь, например. Хотя и ваш вариант вполне себе ничего. :)ladik писал(а):Плюс у Вас нет задержки цикла
Лучше, наверное, активировать Display Style, а то так они от строк визуально не отличимы. Просто как совет.electrolab писал(а):На МК отсылаются байты. При получении байта 0хАА МК зажигает светодиод и отправляет обратно байт 0х51. При получении любого другого байта - светодиод гасится, обратно высылается 0х52.
-
- interested
- Сообщения: 7
- Зарегистрирован: 04 апр 2016, 22:49
- Версия LabVIEW: 15
- Контактная информация:
Re: Периодическая запись и постоянное чтение COM порта
ladik, с наглядным примером осознал, спасибо.
А вот ещё вопрос. Это получается с VISA Read я получаю строку - массив символов? Т.е. мне её надо будет для анализа разбить по паре символов, потом преобразовать в HEX/BIN, а потом уже как-то разряды вытягивать?
LabView - это короче учиться программировать надо заново
Последовательный - потому что по протоколу данные передаются бит за битом последовательно. RS-323 дуплексный интерфейс. Никто не запрещает мне передавать что-то на устройство и одновременно с этим в тот же момент времени принимать. Ну... по крайней мере в ПЛИСах это реализуется явно и я могу потоками "рулить". Но МК это ж программа уже, на ПК/LabView - тем более. Тяжело с ПЛИСовой паралелльности переключаться на последовательность)))Название интерфейса - последовательный (serial): передача или прием байтов производится последовательно друг за другом.
А вот ещё вопрос. Это получается с VISA Read я получаю строку - массив символов? Т.е. мне её надо будет для анализа разбить по паре символов, потом преобразовать в HEX/BIN, а потом уже как-то разряды вытягивать?
LabView - это короче учиться программировать надо заново
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Периодическая запись и постоянное чтение COM порта
А и там никакой параллельности при работе с COM портом нет. Устройство одно и арбитраж в любом случае должен присутствовать. Два потока не могут (нет, вы можете заставить порт принимать данные параллельно из нескольких потоков, но этот вариант будет работать ненадежно, как минимум, а так будет вообще неработоспособен) передавать данные в один порт одновременно, как и принимать.Тяжело с ПЛИСовой паралелльности переключаться на последовательность)))
На вы вполне управляемо можете рулить потоками. Каждый цикл While и For оформляются как поток и способны выполняться параллельно.
принятый массив символов вы можете преобразовать в байтовый массив с помощью String To Byte Array. А байт в битовый массив.
-
- interested
- Сообщения: 7
- Зарегистрирован: 04 апр 2016, 22:49
- Версия LabVIEW: 15
- Контактная информация:
Re: Периодическая запись и постоянное чтение COM порта
Что значит нет? Как только я получал и идентифицировал первые байты в пришедней посылке я отправлял по RS232 ответный пакет. И какое-то время они успешно одновременно принимались и передавались, с т.з. ПЛИСа, конечно. А как там именно разруливалось на компе я, если честно, даже и не вдавался в подробности, но раз по факту все работало, на аппратном уровне hardware-драйвер же обеспечивал эту возможность значит. Или вы имеете ввиду уже уровень ОС? Ну, там, навреное, да, что-то буферизируется, как-то управляется.А и там никакой параллельности при работе с COM портом нет. Устройство одно и арбитраж в любом случае должен присутствовать. Два потока не могут (нет, вы можете заставить порт принимать данные параллельно из нескольких потоков, но этот вариант будет работать ненадежно, как минимум, а так будет вообще неработоспособен) передавать данные в один порт одновременно, как и принимать.
Это с помощью Number To Boolean Array ?А байт в битовый массив
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Периодическая запись и постоянное чтение COM порта
Представьте себе ситуацию, когда два потока отправляют по строке в 10байт ОДНОВРЕМЕННО в один порт. Сможете внятно пояснить, что получится на выходе?Что значит нет?
ДаЭто с помощью Number To Boolean Array ?
Udp в верхний цикл желательно вставить задержку, как минимум на 50мс
- Вложения
-
- Передача по порту.vi
- (16.59 КБ) 181 скачивание
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Периодическая запись и постоянное чтение COM порта
Что бы было понятно! Последовательный интерфейс (VISA Serial Class) потому что, именно байт за байтом, как при передаче, так и при приеме. Единица информации 1 байт. Поэтому и параллельный порт тоже относится к последовательному интерфейсу. А как на физическом уровне протокола реализуется передача или прием этого байта, это другая тема и на уровне VISA драйвера не имеет значения.Последовательный - потому что по протоколу данные передаются бит за битом последовательно.
-
- interested
- Сообщения: 7
- Зарегистрирован: 04 апр 2016, 22:49
- Версия LabVIEW: 15
- Контактная информация:
Re: Периодическая запись и постоянное чтение COM порта
Доброго времени суток.
Приблизил модель к более реальной. Теперь отправляется два байта. При отправке двух определённых байт МК возвращает тоже 2 байта. Чтобы VISA Read не тупил, ожидая эти два байта, когда их нет сделал селектор для размера буфера для VISA Read.
И вот теперь я получаю два байта как и положено. Хочу снача вывести их по отдельности. Потом - вывести несколько бит или группу бит из одного из байта.
По идее, мне надо сначал преобразовать строку, полученную с VISA Read в массив байт, а потом из массива выдернуть эту пару байт, преобразовать их в число и выдада на индикатор, который настроен на цифровое отображение беззнакового восьмиразрядного числа.
Не могу понять как засунуть байты в массив - нужен какой-то счётчик для индекса массива? Который еще к тому же и сбрасывать нужно будет при получении новой посылки. И непонятно как из массивы "вынуть" нужный элемент - это какой инструмент мне нужно использовать - Index Array? Но потом полученный элемент массива нужно как-то еще преобразовывать же, потому что он же "array"?
Приблизил модель к более реальной. Теперь отправляется два байта. При отправке двух определённых байт МК возвращает тоже 2 байта. Чтобы VISA Read не тупил, ожидая эти два байта, когда их нет сделал селектор для размера буфера для VISA Read.
И вот теперь я получаю два байта как и положено. Хочу снача вывести их по отдельности. Потом - вывести несколько бит или группу бит из одного из байта.
По идее, мне надо сначал преобразовать строку, полученную с VISA Read в массив байт, а потом из массива выдернуть эту пару байт, преобразовать их в число и выдада на индикатор, который настроен на цифровое отображение беззнакового восьмиразрядного числа.
Не могу понять как засунуть байты в массив - нужен какой-то счётчик для индекса массива? Который еще к тому же и сбрасывать нужно будет при получении новой посылки. И непонятно как из массивы "вынуть" нужный элемент - это какой инструмент мне нужно использовать - Index Array? Но потом полученный элемент массива нужно как-то еще преобразовывать же, потому что он же "array"?
-
ladik
- developer
- Сообщения: 275
- Зарегистрирован: 18 ноя 2014, 11:45
- Награды: 1
- Версия LabVIEW: 2015, 2019
- Откуда: Екатеринбург
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Периодическая запись и постоянное чтение COM порта
Взгляните.
- Вложения
-
- Пример.png (15.69 КБ) 14158 просмотров
-
- Пример.vi
- (8.04 КБ) 192 скачивания
Дорогу осилит идущий.
-
- interested
- Сообщения: 7
- Зарегистрирован: 04 апр 2016, 22:49
- Версия LabVIEW: 15
- Контактная информация:
Re: Периодическая запись и постоянное чтение COM порта
С преобразованием на вывод разобрался.
Получилось вывести байт, бит из байта, 3 бита из байта. Класс!)
Спасибо за помощь!
Теперь я решил научиться так же задавать команды.
Сделал ввод байта команды "руками" - в текстовое поле. И 8 тумблеров - биты второго байта. С этих булевых значений я собираю булевый массив, преобразую его в число, число - в строку, объединяю строку с отдельно введенной и засовываю на буфер VISA Write. Но вот засада... насколько я понял, у меня происходит преобразование числа не в HEX, а в ASCII код цифр числа. Непонимаю как мне преобразовать именно в байт всё. Мне надо отправить два байта: AA и BB. С AA проблем нет, т.к. я значения забиваю в текстовое поле, настроенное по умолчанию в HEX. А вот как мне BB получить непонимаю...
ladik, у меня два вопроса)
1) Как у вы сделали Boolean Array? Это инструмент/функция такая? Просто я что-то не нашел ничего подобного.
2) На самой вашей первой схеме, над которой я и опыты ставлю есть два сдвиговых регистра (Shift Register), встроенные в контур While Loop и подсоединные к самому верхнему мультиплексору Select. При этом еще есть и точка соединения с Case Structure. А зачем это всё?
Кстати, а как присоединять вложения vi, что бы ещё и картинка показывалась?)
Получилось вывести байт, бит из байта, 3 бита из байта. Класс!)
Спасибо за помощь!
Теперь я решил научиться так же задавать команды.
Сделал ввод байта команды "руками" - в текстовое поле. И 8 тумблеров - биты второго байта. С этих булевых значений я собираю булевый массив, преобразую его в число, число - в строку, объединяю строку с отдельно введенной и засовываю на буфер VISA Write. Но вот засада... насколько я понял, у меня происходит преобразование числа не в HEX, а в ASCII код цифр числа. Непонимаю как мне преобразовать именно в байт всё. Мне надо отправить два байта: AA и BB. С AA проблем нет, т.к. я значения забиваю в текстовое поле, настроенное по умолчанию в HEX. А вот как мне BB получить непонимаю...
ladik, у меня два вопроса)
1) Как у вы сделали Boolean Array? Это инструмент/функция такая? Просто я что-то не нашел ничего подобного.
2) На самой вашей первой схеме, над которой я и опыты ставлю есть два сдвиговых регистра (Shift Register), встроенные в контур While Loop и подсоединные к самому верхнему мультиплексору Select. При этом еще есть и точка соединения с Case Structure. А зачем это всё?
Кстати, а как присоединять вложения vi, что бы ещё и картинка показывалась?)
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Периодическая запись и постоянное чтение COM порта
electrolab писал(а):насколько я понял, у меня происходит преобразование числа не в HEX, а в ASCII код цифр числа. Непонимаю как мне преобразовать именно в байт всё.
ПКМ на входе/выходе -> Create -> Control / Indicatorelectrolab писал(а):1) Как у вы сделали Boolean Array? Это инструмент/функция такая? Просто я что-то не нашел ничего подобного.
Если вы о диаграммах , то либо делаете скриншот и вставляете как простое вложение, либо делаете сниппет и так же вставляете сюда:electrolab писал(а):Кстати, а как присоединять вложения vi, что бы ещё и картинка показывалась?)
zXtK6BGqz-k
-
ladik
- developer
- Сообщения: 275
- Зарегистрирован: 18 ноя 2014, 11:45
- Награды: 1
- Версия LabVIEW: 2015, 2019
- Откуда: Екатеринбург
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Периодическая запись и постоянное чтение COM порта
На первый вопрос Вам ответили. Отвечаю на второй. Хотя ответ там дан в качестве комментария: "Если ничего не принимается или есть ошибка приёмо-передачи LastMsg не обновляется". В цикле есть только ОДИН сдвиговый регистр, в нём хранится принимаемое сообщение. В случае, если при передаче/приёме была ошибка, сообщение не обновляется - на селекторе True. Ошибки нет - False, приёмный буфер попадает в сдвиговый регистр. Чтобы сообщение не затиралось, когда не ведётся работа с портом, оно просто крутится в регистре - кейс False отправляет его на селектор.
Дорогу осилит идущий.
-
- interested
- Сообщения: 7
- Зарегистрирован: 04 апр 2016, 22:49
- Версия LabVIEW: 15
- Контактная информация:
Re: Периодическая запись и постоянное чтение COM порта
Ага, спасибо, получилось всё с вводом)
Пытался все выделить и что-то сделать - что-то не получается...
Так а как сделать именно массив? Там еще и орагны управления - типа биты можно сдвигать...ПКМ на входе/выходе -> Create -> Control / Indicator
Пытался все выделить и что-то сделать - что-то не получается...
Это-то я понял. Я не понял зачем это все было привязывать к "границам" Можно же было просто ноль повесить на один вход селектора и все. Что мне непонятно - смотрите на картинке ниже, я там красным обвёл.На первый вопрос Вам ответили. Отвечаю на второй. Хотя ответ там дан в качестве комментария: "Если ничего не принимается или есть ошибка приёмо-передачи LastMsg не обновляется". В цикле есть только ОДИН сдвиговый регистр, в нём хранится принимаемое сообщение. В случае, если при передаче/приёме была ошибка, сообщение не обновляется - на селекторе True. Ошибки нет - False, приёмный буфер попадает в сдвиговый регистр. Чтобы сообщение не затиралось, когда не ведётся работа с портом, оно просто крутится в регистре - кейс False отправляет его на селектор.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 0 Ответы
- 506 Просмотры
-
Последнее сообщение Juri
-
- 12 Ответы
- 600 Просмотры
-
Последнее сообщение Sergey Puzanov