Структура данных для того, чтобы хранить данные последовательного порта во встроенном микропрограммном обеспечении

Просто удалите все не-цифры:

var result = Regex.Replace(input, @"\D", "");
5
задан Charles Burns 21 August 2018 в 19:36
поделиться

7 ответов

Кольцевой буфер - лучший ответ. Это самый простой способ смоделировать аппаратный FIFO в чистом программном обеспечении.

Реальная проблема, скорее всего, заключается либо в способе сбора байтов из UART для помещения в буфер, либо в переполнении этого буфера.

115200 бод с обычным 1 стартовым битом, 1 стоповым битом и 8 битами данных, вы можете видеть, что на этот порт поступает до 11520 байт в секунду. Это дает вам в среднем 86,8 мкс на байт для работы. На ПК это может показаться большим количеством времени, но в маленьком микропроцессоре это может быть не так много общих инструкций или, в некоторых случаях, очень много обращений к регистрам ввода-вывода. Если вы переполняете свой буфер из-за того, что байты прибывают в среднем быстрее, чем вы можете их использовать, то у вас будут ошибки.

Некоторые общие советы:

  • Не выполняйте ввод-вывод по запросу.
  • Используйте прерывание Rx Ready.
  • Включите FIFO приема, если он доступен.
  • Полностью очистите FIFO в обработчике прерываний.
  • Сделайте кольцевой буфер достаточно большим.
  • Рассмотрите возможность управления потоком.

Важно выбрать размер кольцевого буфера, достаточный для хранения всего сообщения. Если ваш протокол имеет известные ограничения на размер сообщения, вы можете использовать более высокие уровни вашего протокола, чтобы управлять потоком и выжить, не беспокоясь о том, чтобы поток XON / XOFF работал правильно во всех крайних случаях, или RTS / CTS. чтобы работать должным образом на обоих концах провода, что может быть почти таким же проблемным.

Если вы не можете сделать кольцевой буфер такого размера, вам понадобится какой-то контроль потока.

  • Сделайте кольцевой буфер достаточно большим.
  • Подумайте об управлении потоком.
  • Размер вашего кольцевого буфера достаточно велик, чтобы вместить полное сообщение. Если ваш протокол имеет известные ограничения на размер сообщения, вы можете использовать более высокие уровни вашего протокола, чтобы управлять потоком и выжить, не беспокоясь о том, чтобы поток XON / XOFF работал правильно во всех крайних случаях, или RTS / CTS. чтобы работать должным образом на обоих концах провода, что может быть почти таким же проблемным.

    Если вы не можете сделать кольцевой буфер такого размера, вам понадобится какой-то контроль потока.

  • Сделайте кольцевой буфер достаточно большим.
  • Подумайте об управлении потоком.
  • Размер вашего кольцевого буфера достаточно велик, чтобы вместить полное сообщение. Если ваш протокол имеет известные ограничения на размер сообщения, вы можете использовать более высокие уровни вашего протокола, чтобы управлять потоком и выжить, не беспокоясь о том, чтобы поток XON / XOFF работал правильно во всех крайних случаях, или RTS / CTS. чтобы работать должным образом на обоих концах провода, что может быть почти таким же проблемным.

    Если вы не можете сделать кольцевой буфер такого размера, вам понадобится какой-то контроль потока.

    13
    ответ дан 18 December 2019 в 13:18
    поделиться

    Нет ничего лучше кольцевого буфера.

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

    Если вывод ПК является в пакетах это может помочь сделать буфер достаточно большим для обработки одного пакета.

    Последний вариант - реализовать некоторую форму управления потоком.

    1
    ответ дан 18 December 2019 в 13:18
    поделиться

    Что вы имеете в виду под встроенным устройством? Я думаю, что большинство современных DSP и процессоров легко справятся с такой нагрузкой. Проблема не в кольцевом буфере, а в том, как вы собираете байты из последовательного порта.

    Есть ли у вашего UART аппаратный FIFO? Если да, то вам следует включить его. Если у вас есть прерывание на каждый байт, вы можете быстро столкнуться с проблемами, особенно если вы работаете с ОС или с виртуальной памятью, где стоимость IRQ может быть слишком высокой.

    Если ваша принимающая прошивка очень проста (нет многозадачности) ), и у вас нет аппаратного FIFO, Режим опроса может быть лучшим решением, чем управляемый прерыванием, потому что тогда ваш процессор выполняет только прием данных UART, и у вас нет накладных расходов на прерывание.

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

    Итак, кольцевой буфер в порядке, и вам нужно улучшить его: - Как вы взаимодействуете с оборудованием - Протокол (длина пакета, подтверждение и т. Д.)

    1
    ответ дан 18 December 2019 в 13:18
    поделиться

    Прежде чем пытаться решить проблему, сначала необходимо установить, в чем проблема на самом деле. В противном случае вы можете потратить время, пытаясь исправить что-то, что на самом деле не сломано.

    Не зная больше о своей настройке, трудно дать более конкретный совет. Но вам следует исследовать дальше, чтобы установить, что именно аппаратное и программное обеспечение делает в настоящее время, когда поступают байты, а затем в чем слабое место, где они теряются.

    1
    ответ дан 18 December 2019 в 13:18
    поделиться

    Вы можете реализовать что-то вроде IP-дейтаграммы, которая содержит длину данных, идентификатор и контрольную сумму.

    Редактировать : Затем вы можете жестко запрограммировать некоторую фиксированную длину для пакетов, например 1024 байта или что-то еще, что имеет смысл для устройства. Затем сторона ПК будет проверять, заполнена ли очередь на устройстве, каждый раз, когда оно записывает пакет. Сторона микропрограммного обеспечения будет запускать контрольную сумму, чтобы убедиться, что все данные действительны, и считывать их до длины.

    -2
    ответ дан 18 December 2019 в 13:18
    поделиться

    Кольцевой буфер с вводом-выводом, управляемым прерыванием, будет работать с самой маленькой и самой медленной из встроенных целей.

    Сначала попробуйте его на самой низкой скорости передачи, и только потом попробуйте на высоких скоростях.

    0
    ответ дан 18 December 2019 в 13:18
    поделиться

    Использование кольцевого буфера вместе с IRQ - отличное предложение. Если ваш процессор генерирует прерывание каждый раз при получении байта, возьмите этот байт и сохраните его в буфере. Как вы решите очистить этот буфер, зависит от того, обрабатываете ли вы поток данных или пакеты данных. Если вы обрабатываете поток, просто попросите фоновый процесс удалить байты из буфера и обработать их в порядке очереди. Если вы обрабатываете пакеты, просто продолжайте заполнять буфер, пока у вас не будет полного пакета. В прошлом я много раз успешно использовал пакетный метод. Я бы также реализовал некоторый тип управления потоком, чтобы сигнализировать ПК, если что-то пошло не так, например, полный буфер или если время обработки пакетов велико, чтобы указать ПК, когда он готов к следующему пакету.

    0
    ответ дан 18 December 2019 в 13:18
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: