Стандарт составляет 9600 бод. Это просто стандарт . Используя Arduino Uno SMD R2, какова максимальная практическая скорость передачи, которую я могу достичь?
Бонусные очки для смелых: Как бы вы пошли о создании механизма проверки ошибок, а затем о смешном увеличении скорости передачи, чтобы получить высокие скорости передачи?
arduino-uno-smd
Анонимный пингвин
источник
источник
laqq`na`fca`fga`fga`bcngaah````iin`ha`a`a`bga`fga`bcqpahhqfq```fh`oopa`bca`fca
, Для связи через USB используется чип CH340.Ответы:
Здесь есть несколько факторов:
Все эти факторы имеют отношение к определению максимально достижимой скорости передачи. ATmega328P использует аппаратный делитель от своей тактовой частоты для генерации базовой частоты для последовательного интерфейса. Если нет целочисленного отношения от основного тактового генератора к битовому времени желаемой скорости передачи, MCU не сможет точно произвести желаемую скорость. Это может привести к потенциальным проблемам, поскольку некоторые устройства гораздо более чувствительны к несоответствию скорости передачи, чем другие.
Интерфейсы на основе FTDI вполне терпимы к несоответствию скорости передачи данных до нескольких процентов ошибок. Однако я работал со специализированными встроенными модулями GPS, которые не могли справиться даже с ошибкой скорости передачи 0,5%.
Обычные последовательные интерфейсы допускают ошибку скорости передачи ~ 5%. Однако, так как каждый конец может быть выключен, более распространенная спецификация составляет + -2,5%. Таким образом, если один конец работает на 2,5% быстрее, а другой - на 2,5% медленнее, ваша общая ошибка по-прежнему составляет всего 5%.
В любом случае. Uno использует ATmega328P в качестве основного MCU и ATmega16U2 в качестве последовательного USB-интерфейса. Нам также повезло, что в обоих этих микроконтроллерах используются аналогичные аппаратные средства USART, а также тактовые частоты 16 МГц.
Поскольку оба MCU имеют одинаковое аппаратное обеспечение и тактовую частоту, они оба будут иметь одинаковую ошибку скорости передачи в одном и том же направлении, поэтому мы можем функционально игнорировать проблему ошибки передачи.
В любом случае, «правильный» ответ на этот вопрос будет включать в себя поиск источника для ATmega16U2 и определение возможных скоростей передачи оттуда, но, поскольку я ленив, я полагаю, простое эмпирическое тестирование подойдет.
Быстрый взгляд на таблицу данных ATmega328P приводит к следующей таблице:
Поэтому, учитывая максимальную скорость передачи данных 2 Мбит / с, я написал программу быстрого тестирования:
И затем, глядя на соответствующий последовательный порт с последовательным терминалом:
Похоже, аппаратное обеспечение может без проблем работать на скорости 2 000 000 бод.
Обратите внимание, что эта скорость передачи только дает MCU
6480 тактов на байт, поэтому было бы очень сложно поддерживать последовательный интерфейс занятым. В то время как отдельные байты могут передаваться очень быстро, вероятно, будет много времени, когда интерфейс просто простаивает.Изменить: фактическое тестирование!
2 Мбит / с реальны:
каждый бит равен 500 нс, что в точности соответствует ожидаемому.
Проблемы с производительностью! Общая длина пакета:
500 Кбод:
1 МБод:
2 Мбод:
Примечание. Заметное превышение вызвано плохой практикой заземления зонда и, вероятно, не соответствует действительности. Я использую вывод заземления, который является частью моего зондового прицела, и индуктивность вывода, вероятно, является причиной большинства перерегулирований.
Как видите, общая длина передачи одинакова для 0,5, 1 и 2 МБод. Это потому, что код, который помещает байты в последовательный буфер, плохо оптимизирован. Таким образом, вы никогда не достигнете ничего лучше, чем эффективные 500 кбод, если вы не напишите свои собственные последовательные библиотеки. Библиотеки Arduino очень плохо оптимизированы, поэтому, вероятно, не составит большого труда получить надлежащие 2 Мбод, по крайней мере для пакетной передачи, если вы потратите на это немного времени.
источник
Окно Arduino Serial Monitor ограничивает вас 115200, но это не самая высокая скорость передачи данных. Вы можете прочитать таблицы данных Atmel и FT232 (или что вы используете), чтобы узнать максимум, но я могу успешно использовать 230400 (в два раза быстрее, чем самый большой, который поддерживает последовательный монитор Arduino) без проблем.
Если вы хотите увидеть результаты на своем компьютере, вам потребуется еще один последовательный монитор, который поддерживает другие параметры скорости передачи. Мне нравятся CoolTerm и Termite .
Обратите внимание, что это также сильно зависит от вашей тактовой частоты.
Вот калькулятор, чтобы помочь вам с расчетом, что возможно.
источник
Вероятно, это один из немногих аспектов, в которых доски el-Cheapo отличаются от оригинальных плат. Максимальная скорость последовательной передачи данных в значительной степени ограничена качеством платы и ее расположением. Как только последовательные данные поступают в интерфейсную микросхему AVR или USB, данные будут обрабатываться иначе, чем последовательный протокол UART.
Имейте в виду, однако, что микроконтроллер имеет некоторое базовое аппаратное обеспечение для сдвига входных / выходных последовательных данных на / с выводов ввода-вывода, но абсолютная максимальная частота ограничена тактовой частотой 16 МГц (для AVR). Как только байт перемещается в последовательный буфер, аппаратное обеспечение UART вступает во владение и самостоятельно выдвигает / вытягивает биты. В лучшем случае AVR достигает 16M инструкций в секунду, а прерывания, используемые для заполнения последовательного буфера, имеют некоторые издержки (по меньшей мере 8 тактов для обработки прерываний + инструкции для сохранения текущего состояния + несколько инструкций для фактического заполнения буфера). При заданной скорости передачи данных протокол будет работать с колоссальными n битами в секунду, но вашему контроллеру требуется больше времени для заполнения последовательного буфера, чем для фактического вывода данных, что приводит к более низкой средней пропускной способности, чем вы ожидаете, и UART на холостом ходу. относительно долгое время.
Еще один эффект, который следует помнить, заключается в том, что все накладные расходы, необходимые для выталкивания данных в UART (или извлечения их), не могут быть потрачены в вашей реальной программе, что опять-таки влияет на среднюю практическую пропускную способность. Вы можете использовать каждый цикл инструкций только один раз, либо для заполнения буфера, либо для вычисления основного цикла.
Таким образом, максимальная пропускная способность зависит от используемого вами приложения (насколько быстро данные генерируются / вычисляются / готовы к перемещению в / из последовательного буфера), а фактический «физический» битрейт является лишь малой частью проектного решения.
источник
U2Xn = 1
в USART, имеют тенденцию быть довольно расстроенным из-за несоответствия.Проверка ошибок на самом деле очень проста, и есть библиотека AVR, которая делает это в один слой.
Читайте дальше,
util/crc16.h
и вы должны быть хороши в кратчайшие сроки с включенными примерами.CRC достаточно надежен и быстр для простых приложений.
источник