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);
}
@shawn.t, 👍0
Обсуждение2 ответа
Вывод числа с плавающей запятой должен работать (по крайней мере, с помощью 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;
}
Вы обязательно модифицировали плату перед ее использованием?
На этой странице упоминается как минимум один резистор, который необходимо заменить, чтобы USB "работал".
Стандарт USB требует подтягивающего резистора 1,5 кОм на D+, но известно, что эта плата имеет неправильное значение (R10 на плате). Он поставляется с резистором 10 кОм или 4,7 кОм, но его следует заменить на резистор 1,5 кОм или установить соответствующее значение резистора (например, 1,8 кОм) между PA12 и 3,3 В.
Верно также то, что некоторые компьютеры терпимы к неправильному значению, поэтому, прежде чем менять сопротивление, вы можете попробовать, работает ли оно в вашем случае.
У меня были проблемы с платами bluepill в прошлом, но никогда не было таких проблем, как у вас, после исправления резистора. (до этого даже загрузчик не мог прошить)
Попробуйте напечатать на плате что-нибудь еще и посмотрите, не вырезается ли на ней какой-нибудь узор. например, строка снова и снова или одно и то же число с плавающей запятой снова и снова.
Попробуйте разные скорости передачи данных или даже SoftwareSerial к другой плате.
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
изолируйте область ошибки .... начните с изменения команды печати на
Serial.println("voltage");
.... она напечатает слово "voltage" .... просто запустите ее, чтобы увидеть если тоже зависнет, @jsotola