組み込みプログラムのデバッグには欠かせないシリアルモニタですが、使う上で注意しておくことがあります。
printf関数はdelay関数を挿入したのと同じ効果
シリアルポートからデータを出力する場合、一つのデータの出力を終えてから次のデータをシリアルポートに書き込むことの繰り返しになるため、
Arduinoのprintやprintf関数の実行には、出力する文字数に比例した待ち時間が必要となります。
待ち時間 = 1 / 通信レート(bps) * 10 * (文字数―1)
関数呼び出しに必要なオーバーヘッドは上の時間に比して短いので、通常はこの待ち時間が支配的となります。
通信速度が遅いほど、文字数が多いほど長く時間がかかると覚えておいてください。
例えば9600bpsで20文字のデータを出力するとprintf文の実行に
1/9600 * 10 * (20-1) ≒ 19.8ミリ秒
の時間が必要です。
これは忙しいプログラムとっては大きな影響を与える待ち時間かも知れませんし、10ミリ秒周期の割り込み関数の中にこのprintf文を書くと、プログラムがハングアップしてしまいます。
通信速度115200bpsなら、
1/115200 * 10 * (20-1) ≒ 1.6ミリ秒
と、10ミリ秒周期の割り込み関数の中でも使えるようになります。
さらに、クロック64MHzに設定したPIC18F45K22 にエラー率0%で設定できる2,000,000bpsを使うと待ち時間は
1/2000000 * 10 * (20-1) ≒ 0.095ミリ秒
となり、1ミリ秒周期の割り込み関数の中でも余裕で使えるようになります。
高速の通信レートで、少ない文字数で情報を出力する
以上のことから、シリアルモニタを使う場合は出来るだけ速い通信レートに設定して、最小限の文字数で必要な情報を出力するように留意して下さい。
printf文をデバッグが終わったら削除する必要があるか
デバッグに使ったprintf文は、デバッグ完了時に#ifdefでマスクしたり、コメントアウトしてプログラムから除くのが常識と思われていますが、ものづくりコンテストの課題を解いている場合はそのまま残しておいても構いません。
何故ならば、PCでシリアルモニタを使っている場合も、USBコネクタからケーブルを外してボード単独で動かす場合も、printf文がプログラムの動作に与える影響に変わりは無いからです。
むしろ、printf文のdelayが無くなることによりプログラムの動作が変わる可能性を考えればprintf文はそのまま残しておいた方がベターです。