Страница 2 из 2

Re: Преобразовать число в строку

Добавлено: 08 окт 2018, 16:28
pazitiff25
>>> Я так понимаю NUCLEO-F767ZI ковыряете? Если да, то зачем Вам UART там же USB на борту...

Ага, он самый!

USB никак не могу подключить. В диспетчере устройств выдает ошибку 43 (сбой дескриптора устройства). Поставил драйвер, менял кабели, пересмотрел кучу роликов на ютубе - ни в какую.

Прием данных по com-порту по прерыванию (events)

Добавлено: 13 окт 2018, 02:55
pazitiff25
Доброе утро форумчане! Вожусь с платой STM32F767, передаю данные на компьютер через com-порт, использую VISA Read.
Передаю с мк, например, число 23. LV его в принципе ловит, но еще ловит кучу нулей и какого-то мусора.
visa com port.jpg
Я так думаю, это из-за рассинхронизации. Говорят, надо поставить задержку в цикле - не помогло.
Сделать бы так, чтобы цикл прокручивался после приема числа в буфер VISA Read (типа прием по прерыванию). Аналог прерываний в LV - структура Events. Настроил вкладку на срабатывание по изменению Visa resourse name.
Не работает, программа вообще перестала принимать данные.
Подскажите пожалуйста, что делаю не так? )))
events.jpg

Re: Преобразовать число в строку

Добавлено: 13 окт 2018, 07:57
IvanLis
Второй вариант откидывайте сразу.

Первый более близок к рабочему варианту, но требует доработки.
Я всегда рекомендую использовать "терминатор", почитайте сообщение и тему целиком: http://labviewportal.org/viewtopic.php? ... 849#p65849

В данном случае "0" появляются по причине отсутствия данных.
А "левые" выбросы, возможно из-за попытки преобразования "неполной" посылки.

Re: Прием данных по com-порту по прерыванию (events)

Добавлено: 13 окт 2018, 11:19
Blackman
pazitiff25 писал(а):...Сделать бы так, чтобы цикл прокручивался после приема числа в буфер VISA Read (типа прием по прерыванию). ...
LabVIEW Help: VISA Events
http://zone.ni.com/reference/en-XX/help ... sa_events/

Re: Преобразовать число в строку

Добавлено: 14 окт 2018, 15:58
pazitiff25
Оказалось все просто, надо выкинуть никчемный узел Property Node, и в VISA Read напротив byte count написать константу 2 (количество принятых байт, если число больше 255, я подаю например двухбайтное 4500).

Только почему-то LV принимает число задом наперед. Подаю 4500 (hex1194), а принимается 37905 (hex9411). Подскажите, можно настроить прием сперва старших байтов, а потом младших?

Re: Преобразовать число в строку

Добавлено: 14 окт 2018, 18:35
Vitekkz88
pazitiff25, используйте блок unflatten from string и укажите свойство для терминала byte order как little-endian. Если у Вас уже массив из 2-байтных слов, то можете использовать блок swap word.
По умолчанию LabVIEW работает с данными как big-endian, привет макам.

Re: Преобразовать число в строку

Добавлено: 15 окт 2018, 03:26
pazitiff25
Поставил unflatten from string, разунбандил получающийся кластер, вроде бы заработало ))

Написал программу, увеличивающую поступающее число на 1. Вроде работает, но иногда, если перезагрузить микроконтроллер во время работы LV, начинает считать непойми как, какие-то лестницы получаются вместо плавно увеличивающейся линии. Рассинхронизация что ли? Как с ней бороться, поставить бит четности, поставить побольше стоповых битов, поставить flow control?
visa com port.jpg

Re: Преобразовать число в строку

Добавлено: 15 окт 2018, 03:42
pazitiff25
Наверное не очень правильно устраивать подобный просмотр в реальном времени. Надо класть данные в буфер и потом посылать их пакетом в каком-нибудь прерывании...
А уж перезагружать мк прямо во время работы - вообще смерти подобно.

Re: Преобразовать число в строку

Добавлено: 16 окт 2018, 05:53
Vitekkz88
pazitiff25, вы переполняете диапазон типа u16, поэтому после 65535 следует вновь 0,1,2,3 и т.д.
МК, видимо генерирует числа с типом u32.

Re: Преобразовать число в строку

Добавлено: 16 окт 2018, 14:20
pazitiff25
Поменял все на U32. Обнаружил вот что:
Если сперва запустить программу на LV, а после микроконтроллер, то все работает нормально.
А вот если сперва запустить мк, а после программу, то начинаются "лестницы".

Re: Преобразовать число в строку

Добавлено: 16 окт 2018, 14:24
pazitiff25
Хотя странно, иконка настройки com-порта вынесена за основной цикл, и порт должен инициализироваться до подключения к линиям данных. МК вроде не должен влиять на инициализацию порта, но почему-то влияет ))

Re: Преобразовать число в строку

Добавлено: 16 окт 2018, 16:45
Borjomy_1
Когда вы включаете контроллер после запуска программы, то он сразу шлет посылку с начала. Когда наоборот, то в буфере может оказаться часть посылки не сначала. А так как формат передаваемых данных не содержит байтов обрамления, то определить начало посылки становится как минимум затруднительно.
Мало того, при продолжительной работе единичные сбои в приеме посылки (пропуск байта) будут приводить к потере функциональности программы.

Re: Преобразовать число в строку

Добавлено: 16 окт 2018, 19:52
pazitiff25
Походу так и есть. А что такое байт обрамления? Терминатор это то же самое? Что-то типа служебного символа в конце байта, который говорит об окончании передачи?
Байты обрамления ставятся только сзади, или можно и спереди и сзади?

Re: Преобразовать число в строку

Добавлено: 16 окт 2018, 20:53
IvanLis
pazitiff25 писал(а):Походу так и есть. А что такое байт обрамления? Терминатор это то же самое? Что-то типа служебного символа в конце байта, который говорит об окончании передачи?
Байты обрамления ставятся только сзади, или можно и спереди и сзади?
Если Вы свою обертку не будите делать, только STOP (в конце посылки).
cfgserl.gif
cfgserl.gif (3.75 КБ) 3693 просмотра
Обычно хватает стандартных настроек: VISA Configure Serial Port

Re: Преобразовать число в строку

Добавлено: 17 окт 2018, 13:12
Borjomy_1
Терминальный символ можно использовать только при передаче текстовых посылок. В противном случае поведение программы будет непредсказуемым, так как вы не сможете гарантировать отсутствие кода терминального символа в теле посылки.
Байты обрамления - это когда в начале (и в конце) посылки передаются определенные байтовые последовательности. Можно по байту вначале и байту в конце. Тогда после приема посылки можно проконтролировать, правильно ли она принята. В случае, если удаленное устройство передает данные непрерывно, то наличие байтов обрамления позволяет найти начало посылки при первом подключении. А вообще, я делал вебинар на эту тему...