こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

H8Sマイコンでprintfを複数ポートで使いたい

現在H8S2368マイコンを搭載した基板のプログラムのデバッグなどを行っています。
このボードではマイコンのUARTのSCI1をRS-232Cポートとして使用しており、外部ユニットに接続したりデバッグ時にはプログラム内にデバッグ用に設置したprintfのキャラクタ出力用のポートとして使用しています。

現在UARTのSCI0ポートが未使用の状態で、このポートにWiFiモジュールのESP-WROOM-02を接続したいと考えております。
WiFiモジュールのESP-WROOM-02との通信はSCI0ポートを介するのでプログラミングではprintf関数を使うと思うのですが、現在printf関数で書かれたコードはSCI1ポート専用となっているのですが、
printf関数使用時にSCI0で出力するのか、SCI1で出力するのかを選択するにはどのようにプログラムしたらよいのでしょうか?

なお、printfに関するプログラムはプロジェクト内のこれらのファイルで設定しています。
console.c
lowsrc.c
iodefine.h


console.c内で宣言した”charput”、”charget”はlowsrc.cでしようされています。
どうぞ、ご教示の程よろしくお願い致します。



------------------------(iodefine.hの内容)-------------------------------------------------
#define CONSOLE_PSCI1
#define _CONSOLE_P_SCI1

--------------------------------------------------------------------------------------------------


-------------------------(console.cの内容)--------------------------------------------------

char charget(void);
void charput(char);
void PutStr(char *);

#ifdef CONSOLE_DEBUG
char charget(void)
{
char InputChar;
while (CONSOLE_P.SSR.BIT.RDRF == 0)
{
/* ignore errors */
if ((CONSOLE_P.SSR.BYTE & ORER_FER_PER) != 0x00)
CONSOLE_P.SSR.BYTE &= ~ORER_FER_PER;
}

InputChar = CONSOLE_P.RDR;
CONSOLE_P.SSR.BIT.RDRF = 0;
charput(InputChar);
return (InputChar);
}

void charput(char OutputChar)
{
while ((CONSOLE_P.SSR.BIT.TDRE) == 0);
CONSOLE_P.TDR = OutputChar;

CONSOLE_P.SSR.BIT.TDRE = 0;
}

void charput_sci1(char OutputChar)
{
while ((CONSOLE_P_SCI1.SSR.BIT.TDRE) == 0);
CONSOLE_P_SCI1.TDR = OutputChar;

CONSOLE_P_SCI1.SSR.BIT.TDRE = 0;
}


void PutStr(char *str)
{
while (*str != '\0')
charput(*str++);
}

#else
char charget(void)
{
}

void charput(char OutputChar)
{
}

void PutStr(char *str)
{
}

#endif

--------------------------------------------------------------------------------------------------

投稿日時 - 2016-06-22 13:59:04

QNo.9191153

すぐに回答ほしいです

質問者が選んだベストアンサー

printf()とは別にprintf2()のような関数をデバッグ用に用意するほうが簡単です。

今あまり時間がないのでとりあえず関係ありそうなサイトを紹介しておきます。
http://www.mm2d.net/main/prog/c/printf-01.html

わからないところは補足で質問してください。

投稿日時 - 2016-06-23 11:21:12

お礼

回答頂きありがとうございます。

やはり新しいprintfを自作するのが良い方法なのですね。printfはよく使うのでわかってるつもりでしたが、紹介頂いたサイトでどういうふうにできているのかというのは初めて知りました。

投稿日時 - 2016-06-27 10:31:29

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(5)

ANo.5

No.3です。
SCI0ポートはESP-WROOM-02用に、SCI1ポートはデバッグ用に分けて使用するものとします。

使い分けるには次のようにします。
fprintf( stdout, const char *format , ... );をESP-WROOM-02用に
fprintf( stderr , const char *format , ... );をデバッグ用に使います。
fprintf( stdout, const char *format , ... );はprintf()を使うことが出来ます。

ただし、_SINT write()のなかではstdout、stderrの切り替えが行われていないので、その部分は自分で作る必要が有ります。
元のソースでは、二つのポートcharput(c);、charput_sci1(c);に同じ文字を同時に出力するようになっています。

質問とは直接関係ないのですが、SCIポートによる通信は遅いので割り込みを使わないとCPU時間が無駄に使われてパフォーマンスが低下します。
割り込みを使う方法をお勧めします。
こちらを参考にしてください。
http://hirose.sendai-nct.ac.jp/~ckuma/micom/3664/exsci.html#2-5

投稿日時 - 2016-06-23 16:13:50

お礼

回答頂きありがとうございます。
SCIポートの割り込み制御などもいろいろと調べていきたいと思います。

投稿日時 - 2016-06-27 10:55:55

ANo.4

補足を見ました。
lowsrc.cは低水準入出力関数が定義されているようですね。

printf()で出力先をSC0にするかSCI1にするかを選べるようにするにはprintf()関数自体を改造してfprintf()関数のようなものにする事になるかと思います。
もしくは、printf()を実行する前に出力先を指定する関数(自作することになります)を実行するようにし、printf()では出力先を固定しないような改造をする、といったことも考えられます。
いずれにしても標準ライブラリで提供されているprintf()もしくはそこから呼ばれている低水準入出力関数に手を加えることになり、他の関数への影響があるかもしれません。

そういう訳で、他の回答者様のご意見にあるように、printf()と同等の機能でSCI0に出力する新たな関数を作ったほうが結局は手っ取り早くて他の関数等に影響を及ぼさず安全なのかなと思いました。

投稿日時 - 2016-06-23 15:10:11

お礼

回答頂きありがとうございます。

もともと初期状態で用意されているprintfを改造するというのは、少し自分には難しいのではと思うので、自分で追加できるならそれで済ましたいと思っています。


こちらのサイトなどでもH8マイコンに自作のprintfを追加する方法などが掲載されていたり、いろいろと方法があるようなので、やってみるつもりです。



イチから作って丸ごと学ぶ! H8マイコン道(12):シリアル通信でオリジナルprintf関数を作ろう (3/3) - MONOist(モノイスト) http://monoist.atmarkit.co.jp/mn/articles/1003/26/news096.html

投稿日時 - 2016-06-27 10:41:28

ANo.2

標準ライブラリ構築ツールを確認すると良いと思います。
でも標準のcからして、入出力の切り替えなん
て考慮してないのでは?なんて思っちゃいます。
また、大規模な拡張になる気がするので、
全体の動作もかわらないか心配です。

私もH8のプログラミング経験があるだけで、
リアルタイムOSは導入したことないんです。
ROMもRAMも基本キツキツなので、全てアセンブラで自作してました。
私の師匠は使ったことあるみたいでした。

あと、ルネサスで用意してるフォーラムを利用した方が、
情報集めやすいかもしれないです。

役にたたなくてごめんなさい。

投稿日時 - 2016-06-23 05:46:56

お礼

回答頂きありがとうございます。
現在デバッグを行っているボードでは確かにマイクロOSを搭載しています。プログラミング領域はまだ余裕があるようなのですが、グローバル変数を管理しているRAM領域がかなりキツキツみたいで、以前LCD画面表示のデバッグでいろいろとプログラムを追加している時にオーバーしているとの警告が出てきたことがあり、mapファイルでそれが分かったことがありました。

次回プログラム修正などでの追加は無理かなぁ・・・ みたいな感じで思ってたので今回とても心配です。

ルネサスさんのサイトだとより詳細な感じもするので、活用させていただきます。

投稿日時 - 2016-06-27 10:20:47

ANo.1

ちなみにlowsrc.cはどのようなソースでしょうか。printfとcharget,charputの関係性がよくわからないので補足いただけると何かわかるかもしれません。

投稿日時 - 2016-06-22 18:13:22

お礼

回答頂きありがとうございます。

現在のlowsrc.cのファイルを下記のサイトに置かせていただきました。

https://github.com/KenjiMaehara/ios_apply_test/tree/20150720_test/H8S2368_console/console

ご確認頂き、ご指摘頂きますようよろしくお願い致します。

投稿日時 - 2016-06-23 11:42:02

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-