シリアル通信での文字列受信について
ねこまる 2015/06/29(Mon) 08:36
はじめまして.ねこまるといいます.
シリアル通信での文字列受信についての質問です.
現在Arduinoから文字列をシリアル通信で受信をしているのですが,文字列として扱おうとすると,以下のようなコードを書かなくてはなりません.
void Main()
{
Serial serial(5, 9600);
Array<uint8> receive_data;
while (System::Update()) {
//Graphics3D::FreeCamera();
serial.writeByte(1); //なんでもいいから適当に送る
serial.readBytes(receive_data);
String string;
for (size_t i = 0; i < receive_data.size(); ++i){
string.push_back(receive_data[i]);
}
Println(string);
}
}
Prinln(receive_data)と引数にArrayを直接入れると,uint8の数字のリストが出てきてしまいます.
これをもうちょっとスマートに(関数一行)などで書く方法などありますでしょうか?
もしもっとよい方法があれば教えてもらいたいです.よろしくお願いします
Reputeless 2015/07/02(Thu) 00:18
簡潔に回答すると、上記のコードの処理で OK です。
このような仕様になっている理由は、
シリアル通信で送られてくるデータが英数文字列のみか、もしくは日本語を含むか、
もしくは単なるバイナリデータであるか判断ができないためです。
文字列が ASCII 文字だけの場合、
range-based for を使えば Array<uint8> から String にもう少しだけシンプルなコードで変換できます。
void Main()
{
Serial serial(5, 9600);
Array<uint8> receive_data;
while (System::Update())
{
serial.readBytes(receive_data);
String string;
for (const auto& c : receive_data)
{
string.push_back(c);
}
Println(string);
}
}
もしくは次のようにするのもありです。
void Main()
{
Serial serial(5, 9600);
Array<uint8> receive_data;
while (System::Update())
{
serial.readBytes(receive_data);
const String string = Widen(std::string((const char*) receive_data.data(), receive_data.size()));
Println(string);
}
}
Siv3D 側でももう少し工夫ができそうなので、今後検討してみたいと思います。
ご質問ありがとうございました。