M
M
MWX Library
検索…
mwx::stream
入出力ストリーム
入出力ストリームを処理する上位クラスです。
    CRTP (Curiously Recurring Template Pattern) 手法を用いたポリモーフィズムにより、いくつかのクラス(Serial, Wire, SPI, smplbuf) にインタフェースを提供します。
      CRTP では下位クラスは template class Derived : public stream<Derived>;のように定義し、上位クラスからも下位クラスのメソッドを参照します。
    本クラスでは print メソッド、<< 演算子などの共通処理の定義を行い、下位クラスで実装した write() メソッドなどを呼び出すことで、仮想関数を用いるのと近い実装を行っています。

インタフェース(下位クラスで実装)

下位クラスでは、以下に列挙する関数を実装します。

available()

1
int available()
2
3
// example
4
while(Serial.available()) {
5
int c = Serial.read();
6
// ... any
7
}
Copied!
入力が存在する場合は 1、存在しない場合は 0 を返します。
パラメータ
解説
戻り値 int
0: データなし 1:データあり
本実装の戻り値はバッファ長ではありません。

flush()

1
void flush()
2
3
// example
4
Serial.println("long long word .... ");
5
Serial.flush();
Copied!
出力をフラッシュ(出力完了まで待つ)します。

read()

1
int read()
2
3
// example
4
int c;
5
while (-1 != (c = read())) {
6
// any
7
}
Copied!
ストリームより1バイトデータを入力します。データが存在しない場合は -1 を戻します。

write()

1
size_t write(int c)
2
3
// example
4
Serial.write(0x30);
Copied!
ストリームに1バイト出力します。
パラメータ
解説
n
出力したい文字。
戻り値 size_t
出力が成功すれば 1、失敗すれば 0。

vOutput()

1
static void vOutput(char out, void* vp)
Copied!
1バイト出力を行うスタティック関数です。クラスメソッドではないため、メンバー変数等の情報は利用できません。替わりにパラメータとして渡される vp にクラスインスタンスへのポインタを渡します。
このスタティック関数は内部的に利用されfctprintf()の1バイト出力関数として関数ポインタが渡ります。これを用いてprintメソッドなどを実装しています。
パラメータ
解説
out
出力したい文字
vp
クラスインスタンスへのポインタ 通常は、元のクラスにキャストして write() メソッドを呼び出す

インタフェース

putchar()

1
void mwx::stream::putchar(char c)
2
3
// example
4
Serial.putchar('A');
5
// result -> A
Copied!
1バイト出力します。
1
size_t print(T val, int base = DEC) // T: 整数型
2
size_t print(double val, int place = 2)
3
size_t print(const char*str)
4
size_t print(std::initializer_list<int>)
5
6
// example
7
Serial.print("the value is ");
8
Serial.print(123, DEC);
9
Serial.println(".");
10
// result -> the value is 123.
11
12
Serial.print(123.456, 1);
13
// result -> 123.5
14
15
Serial.print({ 0x12, 0x34, 0xab, 0xcd });
16
// will output 4byte of 0x12 0x34 0xab 0xcd in binary.
Copied!
各種整形出力を行います。
パラメータ
解説
val
整形出力したい数値型
base
出力形式
BIN 二進数 / OCT 8進数 / DEC 10進数 / HEX 16進数
place
小数点以下の桁数
戻り値 size_t
書き出したバイト数

printfmt()

1
size_t printfmt(const char* format, ...);
2
3
// example
4
Serial.printfmt("the value is %d.", 123);
5
// result -> the value is 123.
Copied!
printf 形式での出力を行います。
TWESDK/TWENET/current/src/printf/README.md 参照

operator <<

1
// examples
2
Serial << "this value is" // const char*
3
<< int(123)
4
<< '.';
5
<< mwx::crlf;
6
// result -> this value is 123.
7
8
Serial << fromat("this value is %d.", 123) << twe::crlf;
9
// result -> this value is 123.
10
11
Serial << mwx::flush; // flush here
12
13
Serial << bigendian(0x1234abcd);
14
// will output 4byte of 0x12 0x34 0xab 0xcd in binary.
15
16
Serial << int(0x30) // output 0x30=48, "48"
17
<< '/'
18
<< uint8_t(0x31); // output '1', not "48"
19
// result -> 48/1
20
21
smplbuf<char,16> buf = { 0x12, 0x34, 0xab, 0xcd };
22
Serail << but.to_stream();
23
// will output 4byte of 0x12 0x34 0xab 0xcd in binary.
24
25
Seiral << make_pair(buf.begin(), buf.end());
26
// will output 4byte of 0x12 0x34 0xab 0xcd in binary.
27
28
Serial << bytelist({ 0x12, 0x34, 0xab, 0xcd });
29
// will output 4byte of 0x12 0x34 0xab 0xcd in binary.
30
Copied!
引数型
解説
char
1バイト出力 (数値としてフォーマットはしない)
int
整数出力 (printf の "%d")
double
数値出力 (printf の "%.2f")
uint8_t
1バイト出力する(char型と同様)
uint16_t
2バイト出力する(ビッグエンディアン順)
uint32_t
4バイト出力する(ビッグエンディアン順)
const char*
uint8_t*
const char[S]
終端文字までを出力します。出力には終端文字は含まれません。
(Sは固定配列のサイズ指定)
uint8_t[S]
配列サイズSバイト分をそのまま出力します。
(Sは固定配列のサイズ指定)
format()
printf 形式での出力
mwx::crlf
改行 CRLF の出力
mwx::flush
出力のフラッシュ
bigendian()
数値型をビッグエンディアン順で出力する。(右辺値)
std::pair<T*, T*>
バイト型の begin(), end() ポインタを格納したペア。make_pair により生成できる。Tuint8_t 型を想定する。(右辺値)
bytelist()
std::initializer_list を用いるバイト列の出力
smplbuf<uint8_t,AL>&
uint8_t型の配列クラスの内容を出力する。
smplbuf<uint8_t, AL>::to_stream()
smplbuf<T> のデータを出力する Tuint8_t型、ALメモリ確保手段
バイト列として出力する際は、uint8_t, uint16_t, uint32_t 型にキャストします。また文字列として数値出力する場合は明示的にint形にキャストするようにしてください。
1バイト型は型名によって取り扱いが違います。通常はサイズを意識したuint8_t[S]型を用いるようにしてください。

set_timeout(), get_error_status(), clear_error_status()

1
uint8_t get_error_status()
2
void clear_error_status()
3
void set_timeout(uint8_t centisec)
4
5
// example
6
Serial.set_timeout(100); // 1000msのタイムアウトを設定
7
uint8_t c;
8
Serial >> c;
Copied!
>>演算子を用いた入力タイムアウトとエラーを管理します。
set_timeout() によりタイムアウト時間を指定し、>>演算子により入力処理を行います。所定時間内までに入力が得られない場合は get_error_status() によりエラー値を読み出せます。clear_error_status()によりエラー状況をクリアします。
引数型
解説
centisec
1/10秒単位でタイムアウト時間を設定します。
0xffを指定した場合は、タイムアウトを無効とします。

エラー値

意味
0
エラーなし
1
エラー状況

operator >>

1
inline D& operator >> (uint8_t& v)
2
inline D& operator >> (char_t& v)
3
template <int S> inline D& operator >> (uint8_t(&v)[S])
4
inline D& operator >> (uint16_t& v)
5
inline D& operator >> (uint32_t& v)
6
inline D& operator >> (mwx::null_stream&& p)
7
8
//// 例
9
uint8_t c;
10
11
the_twelite.stop_watchdog(); // ウォッチドッグの停止
12
Serial.set_timeout(0xFF); // タイムアウト無し
13
14
// 1バイト読み出す
15
Serial >> c;
16
Serial << crlf << "char #1: [" << c << ']';
17
18
// 読み捨てる
19
Serial >> null_stream(3); // 3バイト分読み捨てる
20
Serial << crlf << "char #2-4: skipped";
21
22
// 4バイト分読み出す (uint8_t 型固定長配列限定)
23
uint8_t buff[4];
24
Serial >> buff;
25
Serial << crlf << "char #5-8: [" << buff << "]";
Copied!
入力処理を行います。
    setup() 内では実行できません。
    ポーリング待ちを行うため、タイムアウトの時間設定(タイムアウト無しなど)によっては、ウォッチドッグタイマーが発動してリセットする場合があります。
通常はloop()中で以下のような読み出しを行います。
1
void loop() {
2
uint8_t c;
3
while(Serial.available()) {
4
Serial >> c;
5
// または c = Serial.read();
6
7
switch(c) { ... } // cの値によって処理を分岐する
8
}
9
}
Copied!
以下に読み出し格納できる型を列挙します。
引数型
解説
uint8_t, char_t
1バイト入力
uint16_t
2バイト入力(ビッグエンディアン順)
uint32_t
4バイト入力(ビッグエンディアン順)
uint8_t[S]
Sバイト分入力
(Sは固定配列のサイズ指定)
null_stream(int n)
nバイト読み捨てる
最終更新 11mo ago