王様の耳はロバの耳!

OCN blogzine からお引越ししました
でもやっぱり何も聞かなかったことにしてください(笑)

PSoC3/4/5LPでprintfの出力先をUARTにしたいとき

2015-09-27 21:33:44 | PSoCで遊ぼう

意外と知られていないようなので.これはじつはUARTのデータシートに書いてあります.載るようになったのはVer.2.30からのようです. このUART_printf.cをプロジェクトに加えるだけでOKです.あ,もちろんUART_1_PutChar(c)などの部分は自分の作ったモジュールの名前に合わせて変えてください.

[20150928追加] GCC環境(PSoC4/5LP)のprintf系関数で %f がうまくいかない問題も,UART_printf.c ではこそっと解決されています.

/* Add an explicit reference to the floating point printf library to allow
the usage of floating point conversion specifier */
#if defined (__GNUC__)
asm (".global _printf_float");
#endif

Creator 3.* だったかな,でライブラリが変わったときにデフォでリンクしなくなったということのようです(出典).リンクオプションで -u _printf_float を追加するのと同じ効果だそうです.

#オプションついでにいうと,math.hをインクルードしたのに数学関数使えないジャン!なときは,メニューバーからProject-Build Settings-ARM GCCほげほげ-Linker-General と進んで,Additional Libraries に"m"と書くのも著名なはまりポイントですね.要はlibm.aをデフォルトではリンクしないということ.組み込みだもんね.

何年か前にPastelmagicの掲示板で話題になったときの記事はこちら.もう古い情報かな.UART_printf.cとは解決方法が違います.

[20150928さらに追加] 大事なことが抜け落ちていました.PSoC5LPでprintfを使うには,デフォルトのHeap Size (0x80=128bytes)では小さすぎます.大きめにとってください.ここでは0x1000=4kbytesにしてみます.

#昨日の自分は他人,だなあ.身に沁みる… orz

#結局 newlib-nanoのソース読んだのは内緒ね!(爆死)

 

CY8CKIT-059用に作ったテストプログラムをここに置きます.PSoC Creator 3.3用です.KitProg USB-UARTのポート番号を確認し,TeraTerm等でご確認ください.その際,ボーレートの設定をお忘れなく.テストプログラムは115,200ボーで作りましたので,USBUARTデバイスとTeraTermの双方で設定が必要です.

PSoC Creator 3.2 SP1 版のテストプログラムはこちらです.

ポート番号を調べる

USBUARTデバイスでのボーレート設定

TeraTermを起動してポートを設定

ボーレートを設定する.

受信改行コードをLFにしておく

TeraTermによる実行画面のようす

[20150928さらにさらに追加] PSoC4環境で確かめてみました.やはりHeap Size がデフォルトの0x80(=128)bytesでは動きません.0x800(=2048)bytesではうまくいきました.が,PSoC4はメモリが少ないのでちょっと取り過ぎかもしれません.数字を少しづつ変えて調整することになるでしょう.

CY8CKIT-049-42xx (PSoC4 Prototyping Kit)で動くテストプログラムです.PSoC Creator 3.3用です.Bootloader Hostを使って書き込みます.詳しくはこちらのページを参照してください.(Creator 3.2用のドキュメントですが,open new project したときの最初の画面(5ページ目)以外は変わっていません.

このボードでUSBUARTを使おうとするとSDC版UARTモジュールってのを使うことになるんですね.で,ちょっと関数名が違うと.UART_printf.cの中の関数名もUART_1_UartPutCharのように変わっています.

PSoC3での検証はまたの機会に.

 


Windowsのユーザ名を1バイト文字で作りかつ多バイト文字のフルネームを登録する方法について

2015-09-21 12:00:53 | PSoCで遊ぼう

 Windows XP以降漢字を含むユーザー名でアカウントを作ることができますが,しかしこれをやると正常に動作しないソフトウェアもいまだにしつこく存在します.ユーザーのホームフォルダ名をユーザー名そのままでつけてしまうことが問題の根本です.どうしても「パス名に多バイト文字はこない(ASCIIのみ)」ことを仮定したプログラムコードは撲滅が困難です.また,1バイト文字で事足りる文化圏で作られたプログラムに正しい多バイト文字対応を求めるのは,(たくさんの人が使う)メジャーなものでなければ難しいのが現状でしょう.

 Windows XPの時代からの豆知識,ということになりますが,ユーザー名を1バイト文字で作り,ただしメニューの表示等に現れる名前をフルネーム表示する方法を紹介します.

 PSoC Designer / Creator もまだこの問題を抱えたままで,まったく改修する気配がありませんので,自衛するしかありません.またユーザ名を1バイト文字にしておくことで避けられる潜在的な障害を予防することもできるでしょう.(とくに海外で作られたソフトの利用には有効な防衛策と思います.)

PDFはこちら(日本語のみです).