Манипулирование строками с использованием Arduino и C ++ - PullRequest
3 голосов
/ 05 декабря 2009

Я пытаюсь манипулировать строкой в ​​C ++. Я работаю с платой Arduino, поэтому я ограничен в том, что я могу использовать. Я также все еще изучаю C ++ (извините за любые глупые вопросы)

Вот что мне нужно сделать: Мне нужно отправлять мили в час на 7-сегментный дисплей. Поэтому, если у меня есть номер, например 17,812345, мне нужно отобразить 17,8 на 7-сегментном дисплее. То, что кажется наиболее эффективным способом, - это сначала умножить на 10 (это сместить десятичную точку на одно место), затем привести 178.12345 к int (чтобы отрезать десятичные точки). Часть, над которой я застрял - это как разбить на части 178. В Python я мог бы нарезать строку, но я не могу найти ничего о том, как это сделать в C ++ (или, по крайней мере, я не могу найти правильные термины для поиска для)

Имеется четыре 7-сегментных дисплея и 7-сегментный контроллер дисплея. Это будет измерять до десятых долей мили в час. Большое спасибо за помощь и информацию, которую вы можете предоставить мне.

Ответы [ 5 ]

10 голосов
/ 05 декабря 2009

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

float speed = 17.812345;
int display_speed = speed * 10 + 0.5;     // round to nearest 0.1 == 178
int digits[4];
digits[3] = display_speed % 10;           // == 8
digits[2] = (display_speed / 10) % 10;    // == 7
digits[1] = (display_speed / 100) % 10;   // == 1
digits[0] = (display_speed / 1000) % 10;  // == 0

и, как указано в комментариях, если вам нужно значение ASCII для каждой цифры:

char ascii_digits[4];
ascii_digits[0] = digits[0] + '0';
ascii_digits[1] = digits[1] + '0';
ascii_digits[2] = digits[2] + '0';
ascii_digits[3] = digits[3] + '0';
4 голосов
/ 05 декабря 2009

Таким способом вы можете сделать это в C ++ без математического модуля (в любом случае мне это подходит):

#include "math.h"
#include <stdio.h>
#include <iostream.h>

int main( ) {

        float value = 3.1415;
        char buf[16]; 
        value = floor( value * 10.0f ) / 10.0f;
        sprintf( buf, "%0.1f", value );

        std::cout << "Value: " << value << std::endl;

        return 0;
}
3 голосов
/ 05 декабря 2009

Если вы действительно хотите обрабатывать это как строки, я бы порекомендовал посмотреть stringstream. Его можно использовать почти так же, как и любой другой поток, такой как cin и cout, за исключением того, что вместо отправки всего вывода на консоль вы получаете фактическое string из сделки.

Это будет работать со стандартом C ++. Не очень много знаю об Arduino, но некоторые быстро ищут, что он не поддерживает струнные потоки.

Быстрый пример:

#include <sstream> // include this for stringstreams
#include <iostream>
#include <string>

using namespace std; // stringstream, like almost everything, is in std

string stringifyFloat(float f) {
  stringstream ss;
  ss.precision(1); // set decimal precision to one digit.
  ss << fixed;     // use fixed rather than scientific notation.
  ss << f;         // read in the value of f
  return ss.str(); // return the string associated with the stream.
}

int main() {
  cout << stringifyFloat(17.812345) << endl; // 17.8
  return 0;
}
0 голосов
/ 05 декабря 2009

Хорошей идеей было бы реализовать поток для отображения. Таким образом, можно использовать синтаксис потока C ++, а остальная часть приложения останется универсальной. Хотя это может быть излишним для встроенной системы.

Если вы все еще хотите использовать std::string, вы можете использовать обратный итератор. Таким образом, вы можете начать с самой правой цифры (в строке) и двигаться влево, по одному символу за раз.

Если у вас есть доступ к коду библиотеки времени выполнения, вы можете настроить для ввода-вывода язык Си. Это легче реализовать, чем поток C ++. Затем вы можете использовать fprint, fputs для записи на дисплей. Я реализовал порт отладки в этом методе, и остальным разработчикам было проще его использовать.

0 голосов
/ 05 декабря 2009

Вы можете использовать такую ​​функцию, как эта toString , и двигаться дальше, как в Python, или просто использовать по модулю 10 100 000 и т. Д., Чтобы получить ее в виде чисел. Я думаю, что манипулировать им как строкой может быть проще для вас, но решать вам.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...