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

Простейшие вопросы в области инженерной разработки

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

Postby pazitiff25 on 08 Oct 2018, 16:28

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

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

USB никак не могу подключить. В диспетчере устройств выдает ошибку 43 (сбой дескриптора устройства). Поставил драйвер, менял кабели, пересмотрел кучу роликов на ютубе - ни в какую.
pazitiff25
beginner
beginner
 
Posts: 14
Joined: 07 Oct 2018, 01:40
LabVIEW Version: 2013
Karma: 0

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

Postby pazitiff25 on 13 Oct 2018, 02:55

Доброе утро форумчане! Вожусь с платой STM32F767, передаю данные на компьютер через com-порт, использую VISA Read.
Передаю с мк, например, число 23. LV его в принципе ловит, но еще ловит кучу нулей и какого-то мусора.

visa com port.jpg


Я так думаю, это из-за рассинхронизации. Говорят, надо поставить задержку в цикле - не помогло.
Сделать бы так, чтобы цикл прокручивался после приема числа в буфер VISA Read (типа прием по прерыванию). Аналог прерываний в LV - структура Events. Настроил вкладку на срабатывание по изменению Visa resourse name.
Не работает, программа вообще перестала принимать данные.
Подскажите пожалуйста, что делаю не так? )))

events.jpg
pazitiff25
beginner
beginner
 
Posts: 14
Joined: 07 Oct 2018, 01:40
LabVIEW Version: 2013
Karma: 0

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

Postby IvanLis on 13 Oct 2018, 07:57

Второй вариант откидывайте сразу.

Первый более близок к рабочему варианту, но требует доработки.
Я всегда рекомендую использовать "терминатор", почитайте сообщение и тему целиком: viewtopic.php?f=21&t=8250&p=65849#p65849

В данном случае "0" появляются по причине отсутствия данных.
А "левые" выбросы, возможно из-за попытки преобразования "неполной" посылки.
User avatar
IvanLis
professor
professor
 
Posts: 4628
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 727
hardware VIP bloggers teachers

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

Postby Blackman on 13 Oct 2018, 11:19

pazitiff25 wrote:...Сделать бы так, чтобы цикл прокручивался после приема числа в буфер VISA Read (типа прием по прерыванию). ...

LabVIEW Help: VISA Events
http://zone.ni.com/reference/en-XX/help ... sa_events/
Blackman
leader
leader
 
Posts: 783
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 225
VIP

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

Postby pazitiff25 on 14 Oct 2018, 15:58

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

Только почему-то LV принимает число задом наперед. Подаю 4500 (hex1194), а принимается 37905 (hex9411). Подскажите, можно настроить прием сперва старших байтов, а потом младших?
pazitiff25
beginner
beginner
 
Posts: 14
Joined: 07 Oct 2018, 01:40
LabVIEW Version: 2013
Karma: 0

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

Postby Vitekkz88 on 14 Oct 2018, 18:35

pazitiff25, используйте блок unflatten from string и укажите свойство для терминала byte order как little-endian. Если у Вас уже массив из 2-байтных слов, то можете использовать блок swap word.
По умолчанию LabVIEW работает с данными как big-endian, привет макам.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
expert
expert
 
Posts: 1044
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 301
hardware I/O VIP

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

Postby pazitiff25 on 15 Oct 2018, 03:26

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

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

visa com port.jpg
pazitiff25
beginner
beginner
 
Posts: 14
Joined: 07 Oct 2018, 01:40
LabVIEW Version: 2013
Karma: 0

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

Postby pazitiff25 on 15 Oct 2018, 03:42

Наверное не очень правильно устраивать подобный просмотр в реальном времени. Надо класть данные в буфер и потом посылать их пакетом в каком-нибудь прерывании...
А уж перезагружать мк прямо во время работы - вообще смерти подобно.
pazitiff25
beginner
beginner
 
Posts: 14
Joined: 07 Oct 2018, 01:40
LabVIEW Version: 2013
Karma: 0

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

Postby Vitekkz88 on 16 Oct 2018, 05:53

pazitiff25, вы переполняете диапазон типа u16, поэтому после 65535 следует вновь 0,1,2,3 и т.д.
МК, видимо генерирует числа с типом u32.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
expert
expert
 
Posts: 1044
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 301
hardware I/O VIP

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

Postby pazitiff25 on 16 Oct 2018, 14:20

Поменял все на U32. Обнаружил вот что:
Если сперва запустить программу на LV, а после микроконтроллер, то все работает нормально.
А вот если сперва запустить мк, а после программу, то начинаются "лестницы".
pazitiff25
beginner
beginner
 
Posts: 14
Joined: 07 Oct 2018, 01:40
LabVIEW Version: 2013
Karma: 0

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

Postby pazitiff25 on 16 Oct 2018, 14:24

Хотя странно, иконка настройки com-порта вынесена за основной цикл, и порт должен инициализироваться до подключения к линиям данных. МК вроде не должен влиять на инициализацию порта, но почему-то влияет ))
pazitiff25
beginner
beginner
 
Posts: 14
Joined: 07 Oct 2018, 01:40
LabVIEW Version: 2013
Karma: 0

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

Postby Borjomy_1 on 16 Oct 2018, 16:45

Когда вы включаете контроллер после запуска программы, то он сразу шлет посылку с начала. Когда наоборот, то в буфере может оказаться часть посылки не сначала. А так как формат передаваемых данных не содержит байтов обрамления, то определить начало посылки становится как минимум затруднительно.
Мало того, при продолжительной работе единичные сбои в приеме посылки (пропуск байта) будут приводить к потере функциональности программы.
Borjomy_1
expert
expert
 
Posts: 1826
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 319
VIP

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

Postby pazitiff25 on 16 Oct 2018, 19:52

Походу так и есть. А что такое байт обрамления? Терминатор это то же самое? Что-то типа служебного символа в конце байта, который говорит об окончании передачи?
Байты обрамления ставятся только сзади, или можно и спереди и сзади?
pazitiff25
beginner
beginner
 
Posts: 14
Joined: 07 Oct 2018, 01:40
LabVIEW Version: 2013
Karma: 0

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

Postby IvanLis on 16 Oct 2018, 20:53

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

Если Вы свою обертку не будите делать, только STOP (в конце посылки).

cfgserl.gif
cfgserl.gif (3.75 KiB) Viewed 106 times

Обычно хватает стандартных настроек: VISA Configure Serial Port
User avatar
IvanLis
professor
professor
 
Posts: 4628
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 727
hardware VIP bloggers teachers

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

Postby Borjomy_1 on 17 Oct 2018, 13:12

Терминальный символ можно использовать только при передаче текстовых посылок. В противном случае поведение программы будет непредсказуемым, так как вы не сможете гарантировать отсутствие кода терминального символа в теле посылки.
Байты обрамления - это когда в начале (и в конце) посылки передаются определенные байтовые последовательности. Можно по байту вначале и байту в конце. Тогда после приема посылки можно проконтролировать, правильно ли она принята. В случае, если удаленное устройство передает данные непрерывно, то наличие байтов обрамления позволяет найти начало посылки при первом подключении. А вообще, я делал вебинар на эту тему...
Borjomy_1
expert
expert
 
Posts: 1826
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 319
VIP

Previous

Return to Для чайников

Who is online

Users browsing this forum: No registered users and 10 guests

cron