VISA -> Serial ошибка обмена данными
-
- beginner
- Сообщения: 27
- Зарегистрирован: 08 мар 2017, 12:22
- Версия LabVIEW: 2012
- Контактная информация:
Re: VISA -> Serial ошибка обмена данными
dadreamer, дело в том, что UART второстепенная функция, в блоке есть более важные задачи, на момент выполнения которых, прерывания от других периферийных модулей, в том числе от UART не обрабатываются (особенности контроллера управления, в нет системы приоритетных прерываний). То есть, если блок обрабатывает другое прерывание, он не сможет ответить на за запрос входящей команды, а если первый байт остался без ответа, тогда смысл продолжать обмен если устройство все равно не ответит, то есть по хорошему надо закрыть соединение и выполнять другую ветку алгоритма. Насчет второго открытия соединения я согласен, этот кусок можно убрать. Вариант "не связывыйтесь с контроллером, если он занят", тут не выйдет, потому что не известно когда блок доступен или нет. Блок готов для дальнейшего обмена, или нет - определяется статусом приема- передачи первого баита, то есть все равно нужно что-то отправить, чтобы определить состояние.
Насчет буфера, нууу какой есть. В блоке стоит 8 битный контроллер управления и изменить его разрядность невозможно (кроме того он работает на достаточно низкой частоте тактирования). Задержка после 1 байта, нужна для того, чтобы контроллер сверился с внутренней системой команд и проверил на наличие совпадений, это требует времени, поэтому нельзя пытаться отправить данные пока контроллер не обработал предыдущий баит, а то это вызовет переполнение буфера и ошибку приема. Дальнейшие задержки можно удалить, потому как передача идет на низкой скорости и данные успеют перезаписаться пока идет прием нового байта, то есть первый баит идет с задержкой а последующие без нее, я это изменю но позже. Но это уже все детали, в любом случае после любой посылки, контроллер должен реагировать, отправлять как минимум квитанцию, которая в любом случае должна меняться в зависимости от того какую команду отправили, а тут получается - что не отправляй, приходит одно и тоже. То есть либо нет передачи либо нет чтения. Завтра осциилом гляну сам UART, возможно дело даже не в . В общем чтобы делать какие то выводы надо на другом ПК попробовать запустить проект и 2 блока и глянут сам обмен на аппаратном уровне...
Насчет буфера, нууу какой есть. В блоке стоит 8 битный контроллер управления и изменить его разрядность невозможно (кроме того он работает на достаточно низкой частоте тактирования). Задержка после 1 байта, нужна для того, чтобы контроллер сверился с внутренней системой команд и проверил на наличие совпадений, это требует времени, поэтому нельзя пытаться отправить данные пока контроллер не обработал предыдущий баит, а то это вызовет переполнение буфера и ошибку приема. Дальнейшие задержки можно удалить, потому как передача идет на низкой скорости и данные успеют перезаписаться пока идет прием нового байта, то есть первый баит идет с задержкой а последующие без нее, я это изменю но позже. Но это уже все детали, в любом случае после любой посылки, контроллер должен реагировать, отправлять как минимум квитанцию, которая в любом случае должна меняться в зависимости от того какую команду отправили, а тут получается - что не отправляй, приходит одно и тоже. То есть либо нет передачи либо нет чтения. Завтра осциилом гляну сам UART, возможно дело даже не в . В общем чтобы делать какие то выводы надо на другом ПК попробовать запустить проект и 2 блока и глянут сам обмен на аппаратном уровне...
Re: VISA -> Serial ошибка обмена данными
Гоните программиста микроконтроллера в шею! Нанимайте толкового студента, курса так третьего.ZAFA писал(а): То есть, если блок обрабатывает другое прерывание, он не сможет ответить на за запрос входящей команды, а если первый байт остался без ответа, тогда смысл продолжать обмен если устройство все равно не ответит, то есть по хорошему надо закрыть соединение и выполнять другую ветку алгоритма.
У вас скорость передачи 9600 бит/сек. Это значит, что прием байта занимает чуть более 1мс. Это значит, что между прерываниями на прием байта по UART уйдет не менее 1мс.
Это что же за другое такое прерывание, которое обрабатывается больше 1мс. Это либо процессор, с тактовой частотой в пару сотен килогерц, либо кто-то запихнул алгоритм в обработчик прерывания.
Вы не правильно понимаете смысл закрыть/открыть соединение. Должно быть так: включил прибор, запустил программу -- открыл соединение, вечером пошел домой, закрыл программу -- соединение закрылось. И не забудьте обесточить прибор -- опасно оставлять его без присмотра -- мы ведь помним какой программист писал там прошивкуZAFA писал(а):... то есть по хорошему надо закрыть соединение и выполнять другую ветку алгоритма.
Теперь по делу.
Управление потоком передачи данных (англ. Flow Control) спасет отца русской демократии! Устройство сможет "сказать" хосту, когда оно готово принять байт, а когда нет.
Может на приборе это уже реализовано?
-
- beginner
- Сообщения: 27
- Зарегистрирован: 08 мар 2017, 12:22
- Версия LabVIEW: 2012
- Контактная информация:
Re: VISA -> Serial ошибка обмена данными
Самого себя довольно сложно погнать в шею . Это во первых, во вторых, контроллер старый, PIC16f877a, аппаратно не поддерживает приоритетные прерывания. Да, в обработчике алгоритм, который должен выполнятся в любом случае, пока не будет достигнут определенный результат операции (выше я писал об этом, функция обмена UART - низкого приоритета, она сильно втростепенная). Flow controll не реализован, то есть тут все зависит от того как распаяна FTDI, а она распаяна так, что работает в сквозном режиме что ли, то есть, что принял то и передал, то есть режим терминала c отслеживанием статуса устройства не доступен, то есть она в режиме всегда готов к приему-передаче. Насчет соединения, да, может быть неправильно понял, но мне так надо, есть режим при котором нужно все передачи и действия контроллера остановить, то есть обрубить все связи и соединения и уйти в спящий режим. Может я не совсем правильно оцениваю все это, но по мне, так открыть соединение - передать данные закрыть, это то самое что требуется, тут не идет речь о постоянной передаче массивов данных, а только формат команда - ответ.
Насчет прибора - громко сказанно , самоделка так сказать, Программу писал сам на асме, аппаратная часть покупная, но переделанная чтоб не возиться с ЛУТом и прочими вещами и не переплачивать деньги за заказ палаты на заводе.
Функция UARTа действительно второстепенная, потому как идея "а почему бы не добавить..." пришла когда устройство уже было отлажено и работало, выполняло другие функции. Более того Shamrel, это не ALTERA, или мощный ARM с которыми вы имеете дело, это 8 битный контроллер с 8кб памяти. На функцию обмена места в нем и так почти не осталось, почти впритык.
Кстати попробовал снова установить связь, через ViSA Test Panel, выскочила ошибка VISA: (Hex 0xBFFF0072). В рамках форума кто то писал что такое было, и dadreamer даже что- советовал, но как я понял ничем положительным это не закончилось, может есть идеи как это обойти?
Насчет прибора - громко сказанно , самоделка так сказать, Программу писал сам на асме, аппаратная часть покупная, но переделанная чтоб не возиться с ЛУТом и прочими вещами и не переплачивать деньги за заказ палаты на заводе.
Функция UARTа действительно второстепенная, потому как идея "а почему бы не добавить..." пришла когда устройство уже было отлажено и работало, выполняло другие функции. Более того Shamrel, это не ALTERA, или мощный ARM с которыми вы имеете дело, это 8 битный контроллер с 8кб памяти. На функцию обмена места в нем и так почти не осталось, почти впритык.
Кстати попробовал снова установить связь, через ViSA Test Panel, выскочила ошибка VISA: (Hex 0xBFFF0072). В рамках форума кто то писал что такое было, и dadreamer даже что- советовал, но как я понял ничем положительным это не закончилось, может есть идеи как это обойти?
Re: VISA -> Serial ошибка обмена данными
Если толковать эту ошибку напрямую, то кто-то, а вернее что-то уже открыло порт и держит его.
Однако, я о вас хорошего мнения, потому, думаю, что вы ни раз уже перезагрузились и другой терминал параллельно не запускали. Потому делаю вывод, что ресурс заняла сама же LabVIEW.
Скорее всего (эх, посмотреть бы на текущий код!) вы открыли порт, а потом не закрыли его и остановили программу, либо получилось так, что вы повторно открываете уже открытый порт.
Упростите программу до самого простого. Оставьте всего два компонента "открыть порт", "закрыть порт", а между ними цикл while с кнопкой стоп. Соедините все линией error, и контролируйте ее.
Да! Перед запуском этой пробы, перезапустите LabVIEW (полностью!) и переподключите прибор.
Однако, я о вас хорошего мнения, потому, думаю, что вы ни раз уже перезагрузились и другой терминал параллельно не запускали. Потому делаю вывод, что ресурс заняла сама же LabVIEW.
Скорее всего (эх, посмотреть бы на текущий код!) вы открыли порт, а потом не закрыли его и остановили программу, либо получилось так, что вы повторно открываете уже открытый порт.
Упростите программу до самого простого. Оставьте всего два компонента "открыть порт", "закрыть порт", а между ними цикл while с кнопкой стоп. Соедините все линией error, и контролируйте ее.
Да! Перед запуском этой пробы, перезапустите LabVIEW (полностью!) и переподключите прибор.
-
- beginner
- Сообщения: 27
- Зарегистрирован: 08 мар 2017, 12:22
- Версия LabVIEW: 2012
- Контактная информация:
Re: VISA -> Serial ошибка обмена данными
Пробовал все из выше перечисленного. Блок диаграмма на 1 странице текущей темы, там ничего нет лишнего. Терминал работает, то есть он поддерживает связь, данные принимаются и отправляются корректно. я преустанавливал, драйвера FTDI тоже. Параллельной работы с терминалом не организовывал. В номере порта уверен, что его не использует только FTDI, а не другое устройство. Попробую сделать так как Вы сказали, с простой функцией открытия - закрытия.
-
- beginner
- Сообщения: 27
- Зарегистрирован: 08 мар 2017, 12:22
- Версия LabVIEW: 2012
- Контактная информация:
Re: VISA -> Serial ошибка обмена данными
Ничего не вышло, к сожалению. Повыкидывал все из проекта кроме настроек Serial, собсно чтения, записи и индикатора. Ошибка приема данных, превышен таимаут (10 сек) по приему. Сохранился, ребутнул ПК, переподключил блок ничего не запускал кроме . После ошибки еще раз запустил ВИ и нажал Send, как вы и говорили повторно открылся не закрытый порт, в этот момент считалость 10h, хотя в первый запуск так ничего и не пришло до самого таимаута обмена.
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: VISA -> Serial ошибка обмена данными
1. Перед запуском в LabVIEW проверяем в терминале. Закрываем терминал.
2. Запускаем в LabVIEW. После инициализации порта очищаем буфер приема и передачи без операций ввода-вывода.
3. Покажите Значение в строке команды.
4. Согласно Вашему протоколу ответа может и не быть. Или тогда как работает ожидание ответа в терминале? И как в проге терминала обеспечиваются задержка передачи байтов? Это все к тому что терминал и Ваш прибор работают по разному)
Upd. При инициализации порта необходимо отключить символ терминала.
2. Запускаем в LabVIEW. После инициализации порта очищаем буфер приема и передачи без операций ввода-вывода.
3. Покажите Значение в строке команды.
4. Согласно Вашему протоколу ответа может и не быть. Или тогда как работает ожидание ответа в терминале? И как в проге терминала обеспечиваются задержка передачи байтов? Это все к тому что терминал и Ваш прибор работают по разному)
Upd. При инициализации порта необходимо отключить символ терминала.
-
- beginner
- Сообщения: 27
- Зарегистрирован: 08 мар 2017, 12:22
- Версия LabVIEW: 2012
- Контактная информация:
Re: VISA -> Serial ошибка обмена данными
Терминал работает - все корректно. Последняя схема должна отправлять один байт и читать один байт при нажатии SEND, так ведь? Открыть порт, настроить соединение, указать скорость и другие параметры. Сейчас подоткнулся стареньким C1-55 передача от ПК идет, ответ тоже уходит из контроллера, что конкретно уходит посмотреть не могу - сложно засинхронизироваться. Но данные то уходят и приходят в ПК, почему не читается баит, если до этого все работало?
Дурацкий вопрос, как выполнить пункт 2?
Ответ в терминале есть, причем корректный без очистки буфера.
Дурацкий вопрос, как выполнить пункт 2?
Ответ в терминале есть, причем корректный без очистки буфера.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: VISA -> Serial ошибка обмена данными
Ну, об этом я уже писал:ZAFA писал(а):что конкретно уходит посмотреть не могу - сложно засинхронизироваться
Запустите сниффер и выполните однократный прогон вашей тестовой программы. Получите, что приходит и что уходит.dadreamer писал(а):Хотя, перед этим можно пройтись сниффером трафика, например NI I/O Trace (NI Spy), вдруг что подскажет...
VISA Flush I/O BufferZAFA писал(а):Дурацкий вопрос, как выполнить пункт 2?
Хотя, при корректном обмене не приходится пользоваться этой функцией. Но, может, у вас уникальный случай. :)
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: VISA -> Serial ошибка обмена данными
2. VISA Flash IO Buffer
3. ?
4. ?
По поводу терминала: Байт 07 приходит последним, а он его показывает втором в строке) Это так для размышления)
3. ?
4. ?
По поводу терминала: Байт 07 приходит последним, а он его показывает втором в строке) Это так для размышления)
Re: VISA -> Serial ошибка обмена данными
Дурацкий вопрос.
Что вам мешает для опытов максимально упростить программу?
1. Выкинуть цикл while.
2. Убрать структуру IF и кнопку SEND (надеюсь, в эксперименте Mechanical Action стояло Latch When Releaset ?)
3. Убрать структуру очереди.
4. Для того, что бы настройки было видно без лицевой панели зрителям (то бишь нам на скринах), преобразуйте все контролы в константы.
5. Однократно запустите прибор.
6. Если опять ошибка, то еще упростите схему -- выкидывайте запись и чтение, убедитесь, что виза корректно открывает и закрывает устройство.
Далее мне для советов нужна установленная LabVIEW с VISA, чего у меня нет :(
По идее, после того, как вы отправили байт, нужно запросить у драйвера статус приемного буфера (должен же быть такой VI?), узнать сколько байт принято и ждет чтения. И если там что-то есть, то считывать. Может понадобится задержка после записи перед чтением статуса.
Что вам мешает для опытов максимально упростить программу?
1. Выкинуть цикл while.
2. Убрать структуру IF и кнопку SEND (надеюсь, в эксперименте Mechanical Action стояло Latch When Releaset ?)
3. Убрать структуру очереди.
4. Для того, что бы настройки было видно без лицевой панели зрителям (то бишь нам на скринах), преобразуйте все контролы в константы.
5. Однократно запустите прибор.
6. Если опять ошибка, то еще упростите схему -- выкидывайте запись и чтение, убедитесь, что виза корректно открывает и закрывает устройство.
Далее мне для советов нужна установленная LabVIEW с VISA, чего у меня нет :(
По идее, после того, как вы отправили байт, нужно запросить у драйвера статус приемного буфера (должен же быть такой VI?), узнать сколько байт принято и ждет чтения. И если там что-то есть, то считывать. Может понадобится задержка после записи перед чтением статуса.
-
- beginner
- Сообщения: 27
- Зарегистрирован: 08 мар 2017, 12:22
- Версия LabVIEW: 2012
- Контактная информация:
Re: VISA -> Serial ошибка обмена данными
Не работает с VISA Flush Buffer так же как и до этого. Насчет терминала Blackman, вы не правы, там все ровно рабтает. Таков формат команды и ответа на нее, это не строка отправляется, а последовательно байты из введенной строки, с интервалом 1мс.
-
- beginner
- Сообщения: 27
- Зарегистрирован: 08 мар 2017, 12:22
- Версия LabVIEW: 2012
- Контактная информация:
Re: VISA -> Serial ошибка обмена данными
Shamrel, функции кнопки стояли от отпусканию кнопки, то есть происходило однократное срабатывание, настройки эти тыщу раз проверил, и только что еще раз проверил.
Открытие - закрытие работает, скрина не приведу но проверил, Осциллографом как раз проверял, после того ка добавил чтение в работающий цикл.
Открытие - закрытие работает, скрина не приведу но проверил, Осциллографом как раз проверял, после того ка добавил чтение в работающий цикл.
-
- beginner
- Сообщения: 27
- Зарегистрирован: 08 мар 2017, 12:22
- Версия LabVIEW: 2012
- Контактная информация:
Re: VISA -> Serial ошибка обмена данными
dadreamer, спасибо за совет, но как пользоваться Trace, я еще не разобрался, так что завтра на нормальном осциллографе гляну, что реально пишется в контроллер и приходит из него, сейчас уже поздно возиться с этим, и так весь день убил на это.
Shamrel, тоже спасибо за идеи и советы но даже будь у вас установлена LabVIEW с VISA, у вас нет моего блока, а без него не получится проверить точно проверить работу. Честно говоря, все больше склоняюсь что либо от самой Visa надо отказаться, но все больше мне кажется проблема в ПК и интеграции Visa c дровами виртуального порта FTDI. Завтра на рабочем ПК проверю, с конкретным блоком.
Но опять же, повторюсь, все изначально работало, пока не выскочила ошибка когда проект ВИ с рабочего компа не попытался запустить на домашнем, до этой ошибки все работало корректно.
Shamrel, тоже спасибо за идеи и советы но даже будь у вас установлена LabVIEW с VISA, у вас нет моего блока, а без него не получится проверить точно проверить работу. Честно говоря, все больше склоняюсь что либо от самой Visa надо отказаться, но все больше мне кажется проблема в ПК и интеграции Visa c дровами виртуального порта FTDI. Завтра на рабочем ПК проверю, с конкретным блоком.
Но опять же, повторюсь, все изначально работало, пока не выскочила ошибка когда проект ВИ с рабочего компа не попытался запустить на домашнем, до этой ошибки все работало корректно.
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: VISA -> Serial ошибка обмена данными
Что такое 71? Какой формат дисплея строки? Hex 71 должен быть равен бинарному значению строки q или ASCII коду 113.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 5 Ответы
- 1576 Просмотры
-
Последнее сообщение Artem.spb
-
- 2 Ответы
- 661 Просмотры
-
Последнее сообщение Borjomy_1
-
- 4 Ответы
- 242 Просмотры
-
Последнее сообщение Embedder74