UART — разные результаты между логическим анализатором и Arduino

Я хотел бы декодировать последовательную связь.

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

Я хотел бы интегрировать эту функцию в Arduino, но мой Arduino Mega 2560 выдает совершенно другие последовательные данные, чем мой логический анализатор.

Скорость передачи данных подходит. 230400.

Первый байт — 0x42. Это правильно распознается Arduino. После этого, к сожалению, выходит только тарабарщина.

Есть ли у кого-нибудь идеи, как я могу решить эту проблему?

, 👍0

Обсуждение

Каково напряжение сигнала? Какие контакты Arduino вы используете?, @Abel

В этом случае просто попытайтесь прочитать несколько байтов в буфер., @Abel

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


4 ответа


2

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

Ваш код не может обрабатывать все это одновременно, особенно если вы используете подобные библиотеки Arduino.

Это плюсы и минусы Arduino, она позволяет легко делать простые вещи, но либо ваши требования уже выросли из простых и подходящих для Arduino, либо вы используете библиотеки Arduino, не учитывая, на что они способны, и как?

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

Другой вопрос: откуда вы вообще знаете, что ваш Arduino может использовать скорость 230–400 бит/с? Если он использует источник тактовой частоты 16 МГц, вы не можете получить ровно 230400, но скорость передачи данных при закрытии составляет 222222 бит/с, а это уже ошибка 3,55% по сравнению с тем, что вам нужно. Обычно целевая погрешность превышает 1%, но в крайнем случае многие устройства могут работать в пределах погрешности 2%, поскольку теоретически это позволяет обоим устройствам находиться в пределах 2% от номинальной скорости. Ошибка в 3,5 % обычно слишком велика и очень близка к тому, чтобы вообще не работать.

Изменить: ОК, это не может быть проблемой программного обеспечения, поскольку Arduino UART использует прерывания и использует кольцевой буфер для буферизации данных.

Известно, что AVR с частотой 16 МГц не может точно достичь скорости 230–400 бит/с и будет иметь погрешность в скорости передачи данных 3,5 %, что превышает рекомендации по максимальной ошибке скорости передачи. Что еще хуже, так это то, что вместо более точного кристалла Arduino Mega2560 использует керамический резонатор с дополнительным допуском 0,5%, температурной стабильностью 0,3% и старением 0,2%. Кристалл в любом случае будет иметь допуск выше 0,01% для всех сценариев. Таким образом, наиболее вероятная причина заключается в том, что Arduino Mega2560, можно сказать, не поддерживает надежно скорость передачи данных 230–400 бод, поэтому он не работает.

А также в технических характеристиках Mega256 указано, что минимальное входное высокое напряжение составляет 0,6*Vcc, поэтому при использовании микроконтроллера с напряжением 5 В это будет минимум 3,0 В, поэтому прием сигнала 3,3 В будет в пределах технических характеристик. Так что проблема с напряжением крайне маловероятна.

,

@Justme: Вот [реализация AVR ядра Arduino](https://github.com/arduino/ArduinoCore-avr/tree/master/cores/arduino). ISR «RX Complete» реализован в HardwareSerial\_private.h. Остальные части библиотеки последовательной связи находятся в других файлах с именем HardwareSerial*., @Edgar Bonet


0

При этой скорости передачи данных у вас есть скорость 23 Кбит/с, что дает вам ~40 мкс для каждого вызова цикла. IIRC длина последовательного буфера по умолчанию составляет 16 символов, и вы не комментируете скорость последовательного интерфейса, который вы используете для println(), относительно скорости входящих данных. Поэтому вполне возможно, что вы просто отстаете от входящего потока.

Ваш вопрос требует подхода к диагностике.

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

Если это так, то проблема, скорее всего, либо связана с синхронизацией цикла и быстродействием, либо может быть связана с точностью кристалла/ФАПЧ на этой частоте. (Возможно, тактовая частота просто не соответствует генератору скорости передачи данных, и после первого символа появляется дрейф.)

,

0

Я не знаю, как еще подтвердить решение здесь. @Абель дал решающий намек. Я неправильно измерил напряжение сигнала.

Изменить: я не могу принять свой ответ как решение еще 2 дня.

,

2

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

  1. Точность скорости передачи/бит должна учитываться для КАЖДОГО последовательного канала. В этом случае у вас есть последовательное соединение с внешним устройством и последовательное соединение с консолью Arduino (преобразователь последовательного интерфейса в USB, реализованный в ATMEGA8). Вот хорошая ссылка, чтобы понять проблему генерации скорости передачи данных/бит: https://wormfood.net/avrbaudcalc.php

Обратите внимание, что на самом деле вы не можете установить 230,4 КБ из-за грубой детализации, поскольку UBRR приближается к 1. На самом деле вы получаете скорость 250 тыс. Бод, которая часто используется для периферийных устройств DMX с последовательной адресацией и хорошо работает на большинстве вариантов Arduino. Однако в вашем случае это первая проблема: несоответствие скорости передачи данных вашей периферии и Arduino 2560.

Это таблица, соответствующая 2560

  1. Будет разница между скоростью передачи данных/бит для двух последовательных соединений, поскольку последовательный канал консоли определен в отдельном MCU (ATMEGA8) и у них разные кристаллы. Вам следует изучить схему Arduino Mega 2560 и попытаться понять конфигурацию.

Здесь есть очевидный ответ на большую часть вашей проблемы: устранить одно из двух последовательных соединений. Вы уже обнаружили, что Arduino Zero работает успешно, но не стали выяснять, почему (и проблема не в тактовой частоте MCU).

В некоторых вариантах Arduino имеется встроенный контроллер периферийных устройств USB. Посмотрите на Arduino, использующие ATMEGA32u4, или на более современные варианты, такие как Arduino Zero. В этих вариантах передача с консоли фактически происходит на скоростях USB для последовательной передачи, это скорость, фиксированная на скорости состояния USB-соединения.

Вам следует поэкспериментировать с увеличением скорости передачи данных/бит на консоли выше, чем скорость передачи данных на периферийном устройстве, которую вы используете. Это может решить непосредственную проблему с MEGA 2560. Я бы посоветовал вам попробовать установить на консоли значение 500k или 1M. , это может зависеть от того, для чего ваше IDE-устройство (ПК или Linux) допускает настройку. Я предлагаю перейти на микроконтроллер со встроенным USB.

,

1. Ядро Arduino по возможности переводит UART в режим двойной скорости (U2Xn = 1). Для скорости 230,4 кбит/с вы получаете UBRR = 8 и фактическую скорость передачи данных 222,2 кбит/с (ошибка = -3,5%). Не так плохо, как ошибка в 8,5%, которую вы показываете, но все равно вызывает беспокойство. 2. Два микроконтроллера на плате (ATmega2560 и ATmega16U2) имеют UART одинакового типа и работают на одинаковой частоте. Их ошибки скорости передачи могут быть большими, но они будут совпадать, обеспечивая бесперебойную связь между ними., @Edgar Bonet

@EdgarBonet, согласен с U2XN, но это все равно значительная частота ошибок, если предположить, что кристаллы имеют одинаковую частоту. На самом деле два кристалла будут немного отличаться, что может легко добавить еще +/- 1% разницы. Как я уже сказал, для Arduino Mega 2560 с двумя отдельными асинхронными каналами (один для периферийного устройства и один для USB/последовательного преобразователя) было бы полезно повысить скорость передачи данных на восходящем канале консоли., @Jack Creasey