STM32 "Blue Pill" Serial.print зависает Serial Monitor

У меня возникают трудности при печати переменной любого типа с помощью команды Serial.print(ln).

Последовательный монитор становится неактивным после печати примерно 7–15 раз.

В настоящее время у меня есть плата STM32 Blue Pill Board под управлением Mac OS Mojave и Arduino IDE v 1.8.9

void setup() {
  Serial.begin(9600);
  pinMode(PC13, OUTPUT);

}

void loop() {
  float raw = analogRead(PA0);
  float voltage = (raw * 3.3) / 4096;
  Serial.println(voltage);
  delay(500);
}

, 👍0

Обсуждение

изолируйте область ошибки .... начните с изменения команды печати на Serial.println("voltage"); .... она напечатает слово "voltage" .... просто запустите ее, чтобы увидеть если тоже зависнет, @jsotola


2 ответа


0

Вывод числа с плавающей запятой должен работать (по крайней мере, с помощью Arduino), но чтобы проверить, не может ли он правильно его обработать, я предлагаю вам преобразовать число с плавающей запятой в строку (например, с помощью функции C ftoa и вывести символы по одному или в виде строки.

Поскольку эта функция C недоступна в Arduino, используйте реализацию функции из этой статьи, авторы Мартину Уоллеру:

char *ftoa(char *buffer, double d, int precision) {

    long wholePart = (long) d;

    // Вносим целую часть числа.

    itoa(wholePart,buffer,10);

    // Теперь поработаем над фракцией, если она нам нужна.

    if (precision > 0) {

        // Делаем, так что найдите конец строки и вставьте
        // десятичная точка.

        char *endOfString = buffer;
        while (*endOfString != '\0') endOfString++;
        *endOfString++ = '.';

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

        if (d < 0) {
            d *= -1;
            wholePart *= -1;
        }

        double fraction = d - wholePart;
        while (precision > 0) {

            // Умножаем на десять и вытаскиваем цифру.

            fraction *= 10;
            wholePart = (long) fraction;
            *endOfString++ = '0' + wholePart;

            // Обновляем дробь и переходим к
            // следующая цифра.

            fraction -= wholePart;
            precision--;
        }

        // Завершить строку.

        *endOfString = '\0';
    }

   return buffer;
}
,

1

Вы обязательно модифицировали плату перед ее использованием?

На этой странице упоминается как минимум один резистор, который необходимо заменить, чтобы USB "работал".

Стандарт USB требует подтягивающего резистора 1,5 кОм на D+, но известно, что эта плата имеет неправильное значение (R10 на плате). Он поставляется с резистором 10 кОм или 4,7 кОм, но его следует заменить на резистор 1,5 кОм или установить соответствующее значение резистора (например, 1,8 кОм) между PA12 и 3,3 В.

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

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

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

Попробуйте разные скорости передачи данных или даже SoftwareSerial к другой плате.

,