Поскольку это довольно часто задаваемый вопрос, я бы предложил больше использовать класс-оболочку, наследующий Потоковый интерфейс в строке C (и он также может быть инициализирован из объекта Arduino String
).
Однако использование с классом Arduino String
довольно сложно, так как исходная строка не должна изменяться при использовании StringStream
, но ее можно повторно инициализировать. Использование rvalue (литерал String
, переданный в класс) запрещено с использованием неконстантной ссылки в качестве параметра метода и конструктора setData
.
Однако это не очень проверено, поэтому могут быть некоторые ошибки. Конструктор и назначение копирования / перемещения опущены (и это не должно быть: D), также использование operator=(String&)
и operator=(const char*)
было бы более интуитивно понятным интерфейсом для него.
class StringStream : public Stream
{
public:
StringStream()
{
setTimeout(1);
}
StringStream(const char * str)
{
setData(str);
}
StringStream(const char * begin, const char * end)
{
setData(begin, end);
}
explicit StringStream(String & view) // cannot be String literal (rvalue) and it gets invalidated if you change original String
{
setData(view);
}
////////////////////////////////////
inline void setData(const char * begin, const char * end)
{
m_start = begin;
m_end = end;
setTimeout(1);
}
inline void setData(const char * begin)
{
setData(begin, begin + strlen(begin));
}
inline void setData(String & view)
{
setData(view.c_str(), m_start + view.length());
}
//////////////////////////////////
// Stream Interface:
virtual int available() override
{
return m_end - m_start;
}
virtual int read() override
{
if (m_start < m_end)
{
return *(m_start++);
}
return -1;
}
virtual int peek() override
{
if (m_start < m_end)
{
return *m_start;
}
return -1;
}
virtual size_t write(uint8_t) override {
return 0;
}
protected:
const char * m_start{0};
const char * m_end{0};
};
И тестовая программа будет выглядеть так:
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.println("Output:");
StringStream test{" 144, 7899, -5478"};
Serial.println(test.parseInt());
Serial.println(test.parseInt());
Serial.println(test.parseInt());
test.setData("1 2");
Serial.println(test.parseInt());
Serial.println(test.parseInt());
delay(2000);
}