こんにちは。久しぶりの投稿です。
SynergyS1でUART通信をするコードを書こうとしているのですが、こういった場合どのように書くのが一番スマートなのか、アイデアを頂けたらと思っております。宜しくお願いします。------現在、可変長データの受信のため、readファンクションでタイムアウトを設け1バイトずつ読み出しています。 e = g_sf_comms9.p_api->read(g_sf_comms9.p_ctrl, (uint8_t*)c, 1, 1); // e==SSP_SUCCESSなら有効な受信データ、それ以外ならデータが無かった
仮にreadファンクション呼び出し直前にドライバ側で複数の受信データが溜まっていた場合、上記1バイト受信を繰り返すのは効率が悪いだけので、一回のreadでまとめて手元のバッファに取り出したいと考えています。
素直コードを書くと以下の感じになりそうなものですが、受信データ長はconstデータで渡すため、実際に読み出すことができたデータ長がわかりません。 e = g_sf_comms9.p_api->read(g_sf_comms9.p_ctrl, (uint8_t*)mybuf, sizeof(mybuf), 1);
やはりSSPを使う限り地道に1バイトずつreadするしかないのでしょうか・・・?
環境はSSP 1.2.1です。
以上です。
わわいです 可変長データのメッセージ受信なら、一文字づつ取り込んでいってその都度判断する、ということをしないとどーにもならんのではないかと思いますが。 たいていはそのメッセージの先頭部分にメッセージ長のデータを置いておいて、そこまで読み込んだら残りのバイト数を読みにかかる、という処理にしますねー
#タイムアウトを待つ、とかウェイトする、ってのはそれで済むならいいですが、ダメダメですぜ
> (=Communications Frameworkに関連付けされたUART DriverのコールバックプロパティはNULLでロックされてユーザーのコールバックは登録できないようです)
void* user_uart_callback = NULL;
のようなことがされているということでしょうか?
わわいさん、moonさん、fujitaさん、ありがとうございます。
Queue sizeについてありがとうございました。ドライバとフレームワークのソースコードを少し見てみましたが、FIFO無しUARTチャネルの場合は 1Queue=1キャラクタ でキューに積まれるようです。
おっしゃる通り先頭部分にフレーム長のデータがあれば、SSPで準備されているAPIの仕様に沿った受信ができそうですね。
・受信する周期は?→不定期・最大で何バイトか?→1フレームあたり5~1024バイト・通信速度は?→115200bps・ CR (LF) で終わるのか?→終端文字CR+LF
>void* user_uart_callback = NULL;>のようなことがされているということでしょうか?
こんな感じで鍵マークが付き、いじれません(↓e2 studioの画面キャプチャ)
受信データをコールバックで抜かれると、フレームワークの処理が成り立たないと思われるので、わざとNULL固定にしているのかなと推測しました。