SSブログ

SC1602互換、バックライト付液晶を試してみました 6 [電子工作]

※SilentCのシリアルからコントロール出来るようになりました。ビデオは今夜にアップ予定、、、誰も観ないか。
Img_0765.jpgさて困った。SilentCのシリアルライブラリを上手く動かせないぞ!。
確認はダイレクト実行で行っています。

例えばSciPutcでは出力する文字が全て0になってしまう。

SciPutsにおいても、一部の制御コードは正しく変換されない。例えば以下の文字列は
”\a\thamayan"
最初の\aは'a'と変換されてしまい、7にはならない。\tは正しく9に変換されている。

例えば以下の様な16進文字を入れても
”\x1b[2J”
”x1b[2J”となってしまう。

俺だけか?、きっと俺だけだな。


※とりあえず以下の様にしました。
void main( void )
{
  bell();
  esc_prt( "[2J" );
  SciPuts( "モウスグHIMANガ ウゴキソウデス" );
  Sleep( 500 );
  esc_prt( "[6;0H" );
  esc_prt( "[0J" );
  Sleep( 500 );
  SciPuts( "UMANガ ウゴキソウデス" );
  Sleep( 500 );
  esc_prt( "[2J" );
  Sleep( 100 );
  esc_prt( "[2;0H" );
  SciPuts( "designed by Sexy Butyou" );
  Sleep( 500 );
  esc_prt( "[14;0H" );
  esc_prt( "[0J" );
  Sleep( 100 );
  esc_prt( "[0;1H" );
  esc_prt( "[0J" );
  Sleep( 100 );
  esc_prt( "[2;1H" );
  SciPuts( "Sexy Butyou" );
  Sleep( 100 );
  esc_prt( "[>5h" );
}

void esc_prt( char *msg )
{
  char *buf = MemoryAlloc( 2 );

  *buf = 0x1b; *(buf + 1) = 0;
  SciPuts( buf ); SciPuts( msg );

  MemoryFree( buf );
}

void bell( void )
{
  char *buf = MemoryAlloc( 2 );

  *buf = 0x07; *(buf + 1) = 0;
  SciPuts( buf );

  MemoryFree( buf );
}


新版 明解C言語 入門編

新版 明解C言語 入門編

  • 作者: 柴田望洋
  • 出版社/メーカー: ソフトバンククリエイティブ
  • 発売日: 2004/08/28
  • メディア: 単行本



プログラミング言語C ANSI規格準拠

プログラミング言語C ANSI規格準拠

  • 作者: B.W. カーニハン
  • 出版社/メーカー: 共立出版
  • 発売日: 1989/06
  • メディア: 単行本



新ANSI C言語辞典

新ANSI C言語辞典

  • 作者: 平林 雅英
  • 出版社/メーカー: 技術評論社
  • 発売日: 1997/05
  • メディア: 単行本(ソフトカバー)



nice!(0)  コメント(11)  トラックバック(0) 

nice! 0

コメント 11

noritan

私は、 \a や \x1b は、知らなかったもので、ちょいと調べました。

こんな本しか見つけられなかった。
http://www.amazon.com/dp/067248420X
Programming in C (Hayden Books C Library)
by Stephen G. Kochan

これによると、受け入れ可能なエスケープ文字は、 \b \f \n \r \t \v \\ \" \' \(carriage return) \nnn (octal) だそうで、 \a \xhh は入っていません。

と、いうのは K&R の時代のことで、この本には ANSI C の話も出てきます。 ANSI C では、これらに加えて \xhh \a \? が追加されたそうです。

私の予想では、 SilentC では \x1b は使えなくても \033 なら使えるんじゃないかと思います。

by noritan (2008-10-21 09:16) 

hamayan

なるほど8進ですか。それは試していなかった。
ちょっと今の解決方法では気持ちが悪いので、8進でも良いから使えれば、随分すっきりしますよね。

by hamayan (2008-10-21 09:33) 

noritan

"SciPutc" 関数の件、
Interface 誌の関数一覧表には誤りがあります。 "SciPutc" 関数は、引数を二つ取り、一つ目の引数は無視されています。二つ目の引数に文字コードを入れてください。

《参考サイト》
http://noritan-micon.blog.so-net.ne.jp/2008-09-26
SilentCの知られざる世界 (1)

by noritan (2008-10-21 12:38) 

hamayan

ああ、そうでした、そうでした。
と言うかコンテストの時もこれで嵌っていたよな。

OS-1のマニュアルだと第一引数がデータで第二引数がポートを示すのだけれど、それも間違っていると。なんと言うトラップ。

ドキュメントの類位はなるべく先に直して欲しいなぁ。
by hamayan (2008-10-21 13:42) 

たけまる

> ビデオは今夜にアップ予定、、、誰も観ないか。

見る見る~(^-^)

by たけまる (2008-10-21 19:10) 

noritan

予想がはずれました。

m::d("\b\f\n\r\t\v\\\"\'\033\a\?\x1b")
20003b68 62 66 0a 0d 09 76 5c 22 bf...v\"
20003b70 27 1b 61 3f 78 31 62 00 '.a?x1b.
20003b78 00 00 00 00 0f 43 1b 5b .....C.[

\a と \x1b はもちろん、\b \f \v の三つも取り扱っていないそうです。
文字列内の8進数表記は、受け付けてもらえました。

文字定数の方は、

PrHexByte('\b','\f','\n','\r','\t','\v','\\','\"','\'','\a','\?')
62 66 0a 0d 09 76 5c 22 27 61 3f

この結果は、文字列の場合と一貫性があるからいいとして、

PrHexByte('\x1b','\033')
78

PrHexByte('\033','\x1b')
00

なんで、二つ目が表示されないんだ?
バグっぽいぞ。

by noritan (2008-10-21 20:37) 

hamayan

でもでも、これだけ動いてくれれば、取り敢えず充分かな。
あまり高機能だと、今度はこっちが馬脚を露わすしね。

by hamayan (2008-10-21 21:16) 

hamayan

たけまるさん!Network stickの布教用に、これのプリント基板を作りません。

by hamayan (2008-10-21 21:21) 

たけまろ

おおお。しかーし、社の予算は今週 発売予定のインターフェース誌の企画で全弾撃ち尽くしてしまいました~ (T^T)

by たけまろ (2008-10-22 07:35) 

hamayan

ををを、残念!。T社長、なんとか予算追加お願いします。

音声再生専用ICのライターを入手したので、今までのデモではない音声のデモビデオを今夜にでもアップできるかも。

by hamayan (2008-10-22 09:26) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。