シリアル通信
yuya  2016/06/22(Wed) 15:30
以下のようにしてmbed LPC1768とシリアル通信しています。
# include <Siv3D.hpp>

void Main()
{
Serial serial(3, 9600);
char receive_data[100];
Font font(10);
while (System::Update())
{
serial.read(receive_data);

String string;

for (const auto& c : receive_data)
{
string.push_back(c);
}
font(string).draw();

}
}

mbed LPC1768用のプログラム

#include "mbed.h"


Serial pc(USBTX, USBRX); // tx, rx
int i=0;
int main() {

while(1)
{
printf("%d\n",i);
wait(0.2);
i++;
if(i==1000000)
i=0;

}
}

これを実行すると4秒ごとぐらいにまとめてデータが表示(更新)されます。mbedからは0.2秒ごとに送信しているので0.2秒ごとに表示される形にしたいのですがどのようにすればよいでしょうか?
ちなみにTeraTermで表示すると0.2秒ごとに表示されます



Reputeless  2016/06/22(Wed) 17:09
Serial::read(Type& to) は、to が全部埋まる(yuya さんのプログラムの場合 100 バイト)まで、データを更新せず、埋まらない場合に false を返します。
つまり、40 文字受信していても receive_data を更新せず false を返します。

Serial::available() で受信済みのデータを調べ、Serial::read(void* dst, size_t size) を使って受信した分だけ読み込んでください。
yuya  2016/06/28(Tue) 12:07
void* dst にはどのような関数を入れればよいのでしょうか?
Reputeless  2016/06/29(Wed) 17:07
dst はデータの格納先の先頭ポインタを指定します。
size には読み込むサイズを指定し、これが available() 未満の場合は読み込みに失敗して false を返します。



String string;

if (const size_t read_size = serial.available())
{
Array<uint8> buffer(read_size);

serial.read(buffer.data(), read_size);

for (const auto c : buffer)
{
string.push_back(wchar(c));
}
}

- WEB PATIO -