Передача блока данных с микроконтроллера на ПК через последовательный порт - PullRequest
0 голосов
/ 07 ноября 2018

В моем проекте у меня есть микроконтроллер, который мне нужен для запроса фиксированного количества данных. MCU - это и STM32, и мое приложение с графическим интерфейсом основано на Qt Framework.

В микроконтроллере есть буфер 16-битных данных, который заполняется некоторыми данными. Я определил это так:

uint16_t buffer[0xFFFF] = { 0 };

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

Но теперь мне нужно перенести этот буфер в ПК через последовательный порт. Мой вопрос заключается в том, что было бы правильным подходом, чтобы убедиться, что я правильно получаю все данные этого буфера в моем приложении с графическим интерфейсом?

Это должно быть как можно быстрее (скорость передачи 115200 бод) и максимально безопасным, например. все 65536 элементов должны быть переданы в ПК в правильном порядке (чтобы вывести из них сигнал).

Итак, как мне подойти к этому? например:

  • Нужно ли синхронное или асинхронное соединение?
  • Должен ли я отправлять каждый элемент по одному и ждать подтверждения от ПК для следующей передачи?
  • Как это можно реализовать в пакетном режиме?
  • Нужно ли мне сделать пакет, например 6 байт
    • _START_BYTE_. _COUNTER_H_. _COUNTER_L_. _DATA_H_. _DATA_L_. _END_BYTE_

Я не прошу код (пока я это ценю). Мне интересно узнать наилучший из возможных подходов!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вам необходимо подключить USB-кабель от вашего ПК к периферийному устройству UART.

Как-то так будет работать

https://www.amazon.com/3-3V-Serial-Cable-Terminated-Header/dp/B07FXT9YZ5/ref=sr_1_2_sspa?ie=UTF8&qid=1541617175&sr=8-2-spons&keywords=uart+usb&psc=1

Для сбора данных у вас может быть терминальная программа, например realterm, для регистрации данных.

Нужно ли синхронное или асинхронное соединение?

Асинхронный

Должен ли я отправлять каждый элемент по одному и ждать подтверждения от ПК для следующей передачи?

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

Как это можно реализовать в пакетном режиме?

Вам нужен режим серийной съемки? Если аналоговое устройство, на котором вы собираете эту информацию, не собирает данные с постоянной скоростью, то пакетная передача не имеет смысла, поскольку вы можете увеличить скорость передачи до 921600 бод.

Нужно ли мне сделать пакет, например 6 байтов

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

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

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

Я знаю, что в python есть отличные библиотеки для построения графиков в реальном времени и захвата данных COM-порта.

0 голосов
/ 07 ноября 2018

Нужно ли синхронное или асинхронное соединение?

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

Должен ли я отправлять каждый элемент по одному и ждать подтверждения от ПК для следующей передачи?

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

Как это можно реализовать в пакетном режиме? Нужно ли мне сделать своего рода пакет, например, 6 байтов

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

...