ANSIでのC標準入出力関数は、コンソールデバイスを入出力デバイスとしています。
MPLAB C30コンパイラでは、この標準入出力デバイスとしてはUART1モジュールが
割り当てられていて、これに合わせた低レベル入出力関数もあらかじめ組み込まれ
ています。
従ってこのUART1モジュールによるシリアル通信ができるようになってさえいれば、
標準入出力関数がそのまま直ぐ使えるようになります。
UART1モジュールを使ってシリアル通信で接続できる機器が用意されれば、標準
入出力関数で簡単に入出力を行うことができます。
簡単に用意できる機器はパソコンです。パソコンとRS232Cケーブルで接続し、Windows
標準アプリのハイパーターミナルを使えば、そのままPIC用の入出力デバイスつまり
コンソールとして使うことができます。
【標準入出力関数】
MPLAB C30に用意されている基本的な標準入出力関数には下表のようなものがあります。
関数名 書式とパラメータ 使用例と機能 getchar() int getchar(void); UART1からのデータを入力し、1バイトデータとして返す。
受信エラーのときはEOFを返す入力があるまで待たないので、
この関数の前で入力を待つ処理を追加するか、UART1の
受信割り込み処理関数の中で使う
while(!U1STAbits.URXDA); // 入力待ち
cmnd = getchar(); // 1文字入力putchar() int putchar(int c);
cは出力文字文字cをUART1に出力する。出力エラーが発生したらEOFを返す
putc('*'); // *を出力
for(i=0; i<10; i++)
putc(buffer[i]); // bufferの10文字を順次出力
putc(0xD); // 復帰を出力puts() int puts(const char *s);
sは文字列文字列sをUART1に出力し、最後に改行を付加出力する
char buf[] = "This is text";
puts(buf); // 1行出力printf() int printf(string);
int printf(const char *format,var1,・・・);
stringは文字列
formatは出力制御文字列、var1は変数多機能な出力関数でstringのデータをUART1に出力する
String中のフォーマット指定で変数のデータも出力できる
戻り値は出力した文字数。エラーのときは負数
ただしこの関数を使うと大きなライブラリサイズとなるのでメモリを必要とする
さらにヒープ領域を必要とするのでプロジェクト環境設定でヒープを指定する必要がある
変数を出力するフォーマットは下記format指定に従う。この書式は%で始まる
%[flags][width][.precision][size]type
(1) flags 出力形式で下記がある
- 左つめとする
0 ゼロサプレスしないで0を出力する
+ 正のとき+記号を出力する
space 正のとき空白とする
# 16進数、8進数、10進で少数点が最初のとき0を先頭に付加する
(2) width 出力文字数指定で下記フォーマットのいずれか
n 出力する文字数をn文字とする
*n 最小n文字で左つめで自動調整する
(3) .precisiion 桁数指定
.n n桁で出力する
(4) size 数値の型を指定する
h short int、unsigned short int
l long int、 unsigend long int(n型の場合)
l double(e,E,f,F,g,G型の場合)(floatもこれに含まれる)
ll long long int、 unsigned long long int(d,i,o,u,x,X型の場合)
L long double(e,E,f,g,G型の場合)
(5) type は変数の型指定で下記のいずれか
dかi : 符号つき整数 o :符号なし8進数
u :符号無し整数 x :符号なし16進数(小文字)
X :符号なし16進数(大文字) eかE :doubleの指数形式
f :浮動少数点の実数 gかG :double
c :文字 s :文字列
p :ポインタ値 n :文字数カウンタ(出力なし)
% :%文字そのもの
(例)
printf("\r\nHello!\r\n");
printf("\r\n%.4o %#.4X %#.6x\r\n", data1, data2, data3);
printf("\r\n%.2f DegC %.3fg\r\n", fData1, fData2);