Я пытаюсь отправить большие объемы данных на 115200 через UART. Столкнулся с довольно странной проблемой. Я отправляю данные в цикле while MCU. MCU больше ничего не делает. Я подключаю UART через контакт ввода-вывода. Я заметил, что если я открываю minicom, а затем запускаю UART, данные отображаются правильно. Однако, если я запущу UART, а затем открою minicom, я не получу правильных данных. Я подозреваю, что это как-то связано с обнаружением битов остановки и запуска. Поскольку, когда я случайно открываю minicom, он принимает стоповый бит и стартовый бит за один из битов данных, а данные неверны. Это потому, что данные отправляются все время. Это звучит как разумное объяснение? Или есть что-то еще?
Следы: http://wikisend.com/download/389684/notworking.csv http://wikisend.com/download/977160/working.csv
Конечно, возможно, что у вас есть ошибка в вашей реализации UART с битовым ударом. Как вы определяете время, тратите ли вы цикл, тратя определенное количество времени, или вы выполняете цикл до тех пор, пока не наступит определенный момент времени (единственный реальный способ - помимо изосинхронного кодирования - сделать это - использовать автономный таймер ). Вы можете очень внимательно посмотреть на свой вывод с тестовым символом 0x00 и посмотреть, насколько время (от начала стартового бита до начала стопового бита) отличается от идеального. Мне было бы комфортно с 1% или меньше, вы могли бы обойтись немного больше.
Тем не менее, я согласен с brhans. Бывают ситуации, когда связь между абсолютно правильными отправителем и получателем UART начинается в «неправильный» момент и продолжает рассинхронизироваться навсегда. Это свойство протокола UART и не имеет ничего общего с качеством (или его отсутствием) любой из сторон. Единственный выход - пауза в передаче (перерыв не нужен) длиной более символа.
В качестве иллюстрации ситуации рассинхронизации рассмотрим непрерывную передачу шаблона 0011111101 (формат 8N1).
Когда первый 0 интерпретируется как стартовый бит, биты данных равны 01111110, за которыми следует стоповый бит (1) и следующий стартовый бит (0). Это полностью допустимый поток байтов 0x7E.
Но когда последний 0 интерпретируется как стартовый бит, за ним следуют 1 и 0011111101, что интерпретируется как 10011111 и стоповый бит 1, за которым следует следующий 0 стартовый бит. Это одинаково допустимый поток байтов 0x9F.
Я думаю (но не пробовал), что с другими шаблонами может быть более двух правильных способов интерпретации потока. Я думаю (но опять же, не пытался доказать), что использование четности и/или более 1 стопового бита уменьшит вероятность множественных интерпретаций, но не устранит ее.
браханы
Крис Стрэттон
Красная машина
Красная машина
Крис Стрэттон
Красная машина
Красная машина
ДоксиЛовер
Красная машина
user.dz
Старожил
Старожил
Красная машина
Старожил
браханы