シリアル通信での文字列受信について
ねこまる  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 側でももう少し工夫ができそうなので、今後検討してみたいと思います。
ご質問ありがとうございました。
編集
ねこまる  2015/07/02(Thu) 08:40
Reputeless様

ご回答ありがとうございました.
Widenを使用すればよかったんですね.

最近このライブラリを発見して,感動しながら使わせていただいています.
これからも開発がんばってください.
編集
件名
Re: シリアル通信での文字列受信について
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -