Что я могу сделать, чтобы уменьшить задержку от этих последовательных портов, которые подключены к ПК через адаптер Serial to USB?

8

Я думаю, что я случайно обнаружил потребность в встроенных системах. Что здорово! И довольно страшно. И мне нужна помощь.

Предыстория : меня наняли для создания приложения с графическим интерфейсом, которое берет сканы с двух SICK LMS-291 и интегрирует их с GPS с точностью до дюйма, чтобы вы знали, где происходило каждое сканирование. Как я наивный веб-программист, я понимал, что время будет иметь важное значение, но не понимал, что это также будет сложно! Если вы не знаете, когда произошла каждая точка GPS и каждое сканирование, вы не сможете определить, где происходит сканирование. К сожалению.

Они указали Windows 7 в качестве платформы, а также купили коробку SeaLevel RS422 для USB, чтобы подключить датчики и GPS, и в скором времени я обнаружил свою глупость. Где-то между датчиками и моей компьютерной программой что-то препятствовало своевременному поступлению сканов. LMS выдает 75 сканирований в секунду или 13,32 мс / сканирование. Моя программа не получает их своевременно. Он получает их каждые 100 или около того миллисекунд, группами по 7, 8, 10 или около того. Также иногда появляется недостаточно сканов, или они искалечены. Либо этот адаптер SeaPort отправляет только десять раз в секунду (это возможно? Я не знаю, как работает USB), либо Windows не проверяет буфер (где-то должен быть буфер, верно?) Достаточно часто.

Сегодняшний день : это приводит к некоторым неточностям, с которыми клиент в основном согласен. Я не, тем не менее, и так как у меня есть шанс сделать аналогичную работу для клиента (объединяя больше входов датчиков!), Я хотел бы выяснить, как сделать это правильно, например, учитывая точность GPS , быть в состоянии дать гарантии о точности и точности мест сканирования.

На что это похоже? Мне нужен пользовательский интерфейс и возможность проверять ввод с этих трех устройств каждые 13,32 миллисекунды. Если бы я использовал FreeRTOS с, скажем, Nano-X для графического интерфейса пользователя, работающего на ноутбуке, который они предоставляют, это звучало бы как нормальное решение? Возможно ли, что переход от RS-422 к USB вызывает эти задержки, и использование Windows на самом деле вполне подходит для этой цели?

canisrufus
источник
2
Кого вам пришлось убить, чтобы заполучить эти лазерные дальномеры, и у него был друг, у которого тоже могли быть такие?
Коннор Вольф
@ConnorWolf Ха! Я бы хотел, чтобы они принадлежали мне. Это для ag (определение объема урожая), поэтому они были готовы раскошелиться на оборудование (тракторы могут стоить $ 75 тыс.), Но не желали раскошелиться на программирование таланта.
canisrufus
Я не знаю размер буфера в Windows, но вы, безусловно, хотите это проверить. В Linux эти буферы имеют размер 4 КБ, и в зависимости от данных, которые вы отправляете, и от системных вызовов, которые вы используете, программа может получать только блоки данных размером 4 КБ. Если это проблема, вы хотите тщательно проверить, какие системные вызовы вы используете для чтения из буферов.
Джиппи
1
Я предлагаю вам взглянуть на получение прямого последовательного соединения - вы можете получить карты последовательного порта для ПК и ноутбуков (также обратите внимание, что большинство жестких дисков Panasonic по-прежнему имеют последовательные порты в стандартной комплектации). Это позволит избежать проблем с буферизацией в последовательном интерфейсе USB. Windows 7 обладает достаточно хорошими возможностями в реальном времени, поэтому вам, вероятно, не нужно уходить от этого.
ConcernedOfTunbridgeWells
Просто комментарий: заголовок забавный, но не очень помогает понять содержание вопроса: не могли бы вы уточнить это?
Клабаккио

Ответы:

6

Проблема почти наверняка в буферизации USB, связанной с конвертером USB-RS422. USB имеет переменную и довольно высокую задержку.

Самым простым решением будет лучший интерфейс RS422, в идеале на основе PCI / PCI-e. Это решило бы проблемы с задержкой.

Вы также можете изменить частоту опроса USB, хотя это довольно сильно зависит от операционной системы хоста (на какой платформе вы работаете?).


Что бы это ни стоило, я заглянул на веб-сайт системы sealevel, и он МАССОВНО заражен маркетинговой ерундой. Они буквально тратят, как 10 страниц и несколько официальных документов, говоря: «Мы используем USB-концентратор внутри, а не выполняем мультиплексирование MCU».

Эй, SeaLevel! Вот что делает дешёвый 4-портовый USB-последовательный интерфейс за $ 50, который я купил на e-bay в Китае! Вы не особенный человек, даже если вы пишете полдюжины пустых листовок, пытаясь заставить их звучать так, как вы!

Вы пытались заставить эти вещи использовать драйверы FTDI? Я бы положил на это деньги, они просто используют болотный стандарт FTDI FT232 или аналогичный. Можете ли вы открыть коробку на одном из них и сфотографировать?


Если вы действительно хотите раскрутить свое собственное оборудование для развлечения или обучения, я настоятельно рекомендую вам не пытаться делать все на оборудовании. Поскольку вам нужно просто коррелировать по времени все три сигнала, все, что вам действительно нужно, это что-то, что может прослушивать три последовательные линии (две RS422, одна RS232 (GPS)), снабжать метками времени данные и направлять их на главный компьютер. ,

После того, как данные имеют временную отметку, вы можете свободно использовать любую задержку буфера, поскольку вы всегда можете просто посмотреть на временные отметки.

Реально, если у вас нет базовых аппаратных средств, разработка чего-либо с достаточной сложностью для создания хорошего графического интерфейса - это достаточно сложная задача.

Лично я бы, наверное, бросил довольно массивный ARM MCU на проблему с буферизацией, и с этим покончено. Несмотря на то, что это Arduino, у Arduino Due много SRAM, и он более чем достаточно быстр для того, что вам нужно (и есть много поддержки, что всегда приятно).
В качестве альтернативы, серия STM32 имеет аналогичную производительность и больше предназначена для «продвинутых» пользователей (читайте, примеров меньше или нет ссылок для ссылок). ST делает много очень хороших, очень недорогих плат для оценки .

Благодаря Due вы получаете собственный USB-порт, для которого вы можете использовать свой собственный драйвер CDC, если хотите. Некоторые платы STM32 также имеют встроенный USB.

Коннор Вольф
источник
Что касается ОС: на данный момент я использую Windows 7 на одноядерном планшете. Я также могу использовать ноутбук и устанавливать все, что захочу.
canisrufus
7
Я бы тоже выделил выделение микроконтроллера для корреляции данных, а затем переадресацию его в окно Windows для отображения. +1
JustJeff
1
Карта, на которую вы ссылаетесь, вероятно, сработает, хотя из-за того, что SeaLevel переполнен ерундой, я не уверен, что доверю им. Для чего это стоит, они делают упоминания , что это PCI-E карта использует 16C954аппаратную четверной UART IC (предположительно , есть два из них на карточке).
Коннор Вольф
1
На самом деле, я думаю, что единственное правильное решение - позвонить им и просто спросить о проблемах с задержкой. Там могут быть вещи, которые можно настроить в их драйвере!
Коннор Вольф
2
+1 к решению STM32F4; плата STM32F4-Discovery является комически под -priced, имеет до 6 микросхемы UART и USB порт OTG FS. Если вы не знакомы со встраиваемым дизайном, вам будет довольно сложно запустить USB на нем; Проще всего подключиться через UART с помощью кабеля FTDI. Coocox IDE бесплатен, не имеет ограничений по размеру кода и достаточно хорошо поддерживает плату Discovery.
Markt
3

Если я понимаю вопрос, к чему это сводится, так это к получению сообщений времени / места от GPS по одной последовательной линии и корреляции сообщений данных о дальности, полученных по другим последовательным линиям. В идеале сообщения дальномера должны иметь свою собственную метку времени, и если бы вы могли синхронизировать все часы, вы могли бы определить местоположение, где был взят диапазон, путем интерполяции метки времени между двумя сообщениями GPS с помощью метки времени ближайшего совпадения. Но, конечно, у вас этого нет.

На ум приходит несколько решений, в том числе использование микроконтроллера для корреляции данных в реальном времени и передача его в PPC для отображения. По сути, микроконтроллер решает проблемы с ограничением времени.

Таким образом, для более простого решения все, что вам нужно, это какой-то способ собрать все сообщения из нескольких различных последовательных линий, объединить их в один поток в порядке их поступления и накачать их на ПК. Вы можете сделать вывод, что любое сообщение дальномера между двумя сообщениями GPS происходило когда-то между этими двумя сообщениями.

Это дает вам степень неопределенности, конечно, в зависимости от частоты сообщений GPS. Компромисс состоит в том, что, увеличивая частоту сообщений GPS (чтобы получить более точную корреляцию), вы увеличиваете требования к микроконтроллеру и требования к последовательной связи с ПК. В крайнем случае, последовательная связь насыщена сообщениями GPS с добавлением случайного сообщения о дальности. Очевидно, что большинство этих сообщений GPS не нужны. Преимущество этого решения, однако, в том, что с точки зрения программного обеспечения микро имеет очень мало общего. Вы можете сделать все это простым циклом языка ассемблера, не требуя ОС.

Для более сложного решения вы можете сформировать локальные часы в микро и использовать GPS для синхронизации этих часов, так что когда вы получаете сообщение о дальности, вы можете получить отметку времени, используя часы микро. Используя микро с кристаллической временной базой, вы, вероятно, могли бы обойтись с сообщениями GPS на 1 Гц и все еще получить намного лучше, чем времена точности миллисекунды, отмеченные на сообщениях диапазона. Компетентный специалист по встраиваемым системам, вероятно, мог бы также выполнить это в ассемблере на нижнем конце микро, но вы упомянули, что только начинаете. Вы могли бы взглянуть на более мощный микро, который может работать под Linux, и, возможно, найти уже существующее решение для синхронизации часов Linux с GPS.

JustJeff
источник
Проще, чем построить часы реального времени в MCU и синхронизировать их с помощью GPS, - это просто использовать любую периферию таймера / счетчика для измерения количества циклов между сообщением GPS и сообщением дальномера и добавить эту информацию о времени дельты в поток данных.
Бен Фойгт
3

Я бы, вероятно, сделал бы мультиплексирование последовательных данных в новый последовательный поток данных с более высокой скоростью со статическим чередованием. Затем передайте поток данных через USB-UART на компьютер. Таким образом, вы бы знали, что первый байт от устройства 1, второй байт от устройства 2, третий байт от устройства 3 и в этом случае четвертый байт как CRC или порядковый номер. Добавьте пару байтов начала маркера кадра для синхронизации в потоке данных, добавляя байты, если нет доступных данных, и все готово. Вы можете не знать абсолютное время, но вы знаете, что это относительное время между различными порциями данных.

jippie
источник
1

Я также пошел бы с микроконтроллером, чтобы получить данные RS, отметку времени и передать это к ПК. Вы не можете выполнять работу, связанную с синхронизацией ввода / вывода, с ПК с Windows (возможно, за исключением звуковой карты), потому что программное обеспечение и драйверы постоянно меняются по мере обновления драйверов за вашей спиной.

Но первое, что я хотел бы сделать, - это приобрести USB-логический анализатор, вы можете купить его менее чем за 100 долларов США, получить некоторые сообщения от GPS-приемника и точно проверить, когда будет получен каждый байт. Используйте эту информацию, чтобы попытаться / точно рассчитать, насколько точны данные в первую очередь: например, что именно и когда передает блок GPS. Затем вы сможете выяснить, какая точность достижима и сколько усилий вы готовы приложить, чтобы достичь определенного уровня точности.

введите описание изображения здесь

Выше фото какого-то (Saleae?) USB логического анализатора.


[Править] Ха-ха, использование звуковой карты может быть забавным способом заставить ее работать на самом деле; Вы можете подключить данные UART к входу звуковой карты (через некоторые резисторы и конденсаторы) и написать программное обеспечение для обнаружения каждого фронта в последовательном потоке, обеспечивая прекрасную точность синхронизации !. Хорошо, я не действительно предлагаю это серьезно, просто для некоторых смеется!

PKP
источник