[[lbed]] #contents 2013/07/20からのアクセス回数 &counter; ** あると便利シリアルポート [#k15a8a54] lbedは、LPCXpresso IDEのソースレベルのデバッグができるので、mbedよりもPCと シリアルで接続する機会は少ないとは思うのですが、はやりあると便利なシリアル通信です。 *** 初心者もベテランもArduino IDEのシリアルコンソール [#l872b69d] *** 初心者もベテランもArduino IDEのシリアルモニター[#l872b69d] やはり、Arduinoは良く出来ており、組み込み機器とPCをつないで使うには、Arduino IDEの シリアルモニターが便利です。 PCから文字を入力する場合には、トップのテキストフィールドに文字を入力し、送信ボタンを押します。 組み込み機器からの文字列は、その下のテキストエリアに表示されます。 &ref(SerialMonitor.png); ** テストプログラム [#j282de55] シリアル通信を行うクラスは、Serialで残念ながらmbedのようなStreamに対応させることはできません でした。 そこで、ArudinoのSerialを手本に作成しました。 Serialのインスタンスを生成後、baudメソッドでボーレイトを指定します。 最初にHelloと表示し、文字入力があれば+1した文字コードを送りし、ledを反転させる簡単なプログラムで動作を 確認しました。((文字出力がちょっと不安定です。)) #pre{{ #include<cr_section_macros.h> #include<NXP/crp.h> __CRP extern const unsigned int CRP_WORD = CRP_NO_CRP; #include"lbed.h" DigitalOut myled( LED1); int main(void) { wait_init(); Serial pc(p9, p10); pc.baud(9600); pc.println("Hello"); while (1) { char c = pc.read(); pc.write(c + 1); myled = !myled; } return 0; } }} *** 動作確認 [#j7aad11e] MyARMワークベンチにUSBシリアル変換を差して、PCに接続します。((MyARMの作成時にUSBコネクターのはんだに失敗して、上手くMyARM上でのUSBシリアル通信ができなかったので、別途USBシリアル変換器を購入しました(恥ずかしい))) &ref(SerialSetting.png); *** Serialの実装 [#had9d15b] Serialは、トラ技の2012/10の特集を参考に作成しましたが、出力用のバッファを持っていないので、高速な通信は厳しいです。 #pre{{ #include "Serial.h" #include "PinNames.h" #include "LPC11xx.h" Serial::Serial() : _tx(-1) , _rx(-1) { setup(P1_6, P1_7, "default"); } Serial::Serial(PinName tx, PinName rx, const char *name) : _tx(-1) , _rx(-1) { setup(tx, rx, name); } void Serial::setup(PinName tx, PinName rx, const char *name) { _tx = tx; _rx = rx; _available = false; LPC_IOCON->PIO1_6 |= 0x01; // RXD機能に設定(FUNC=001) LPC_IOCON->PIO1_7 |= 0x01; // TXD機能に設定(FUNC=001) } void Serial::baud(unsigned int baudrate) { unsigned int DL; LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12); // UARTへクロック供給 LPC_SYSCON->UARTCLKDIV = 0x01; // ボーレート生成ブロックへクロック供給 DL = (SystemCoreClock * LPC_SYSCON->SYSAHBCLKDIV) // ボーレート分周比の算出 / (16 * baudrate * LPC_SYSCON->UARTCLKDIV); LPC_UART->LCR |= (1<<7); // ディバイザ・ラッチ・アクセス有効(DLAB=1) LPC_UART->DLM = DL / 256; // ボーレートの設定(U0DLM) LPC_UART->DLL = DL % 256; // ボーレートの設定(U0DLL) LPC_UART->LCR &= ~(1<<7); // ディバイザ゙・ラッチ・アクセス無効(DLAB=0) LPC_UART->LCR = 0x03; // データのフォーマット設定(8bit Non Stop 1) LPC_UART->FCR = 0x07; // 入出力バッファの初期化 _available = true; // 利用可能にセット } void Serial::begin(unsigned int baudrate) { baud(baudrate); } int Serial::write(const char c) { while (!(LPC_UART->LSR & (1<<5))) // データ転送待ち continue; LPC_UART->THR = c; // データ送信 return 1; } int Serial::read() { while (!(LPC_UART->LSR & 0x01)) // 受信待ち continue; return LPC_UART->RBR; // データ受信 } int Serial::available() { return _available ? 1 : 0; } }} ** コメント [#c81be729] #vote(おもしろかった,そうでもない,わかりずらい) 皆様のご意見、ご希望をお待ちしております。 #comment_kcaptcha