2013/07/20からのアクセス回数 3836 あると便利シリアルポート †lbedは、LPCXpresso IDEのソースレベルのデバッグができるので、mbedよりもPCと シリアルで接続する機会は少ないとは思うのですが、はやりあると便利なシリアル通信です。 初心者もベテランもArduino IDEのシリアルモニター †やはり、Arduinoは良く出来ており、組み込み機器とPCをつないで使うには、Arduino IDEの シリアルモニターが便利です。 PCから文字を入力する場合には、トップのテキストフィールドに文字を入力し、送信ボタンを押します。 組み込み機器からの文字列は、その下のテキストエリアに表示されます。 テストプログラム †シリアル通信を行うクラスは、Serialで残念ながらmbedのようなStreamに対応させることはできません でした。 そこで、ArudinoのSerialを手本に作成しました。 Serialのインスタンスを生成後、baudメソッドでボーレイトを指定します。 最初にHelloと表示し、文字入力があれば+1した文字コードを送りし、ledを反転させる簡単なプログラムで動作を 確認しました。*1 #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; } 動作確認 †MyARMワークベンチにUSBシリアル変換を差して、PCに接続します。*2 Serialの実装 †Serialは、トラ技の2012/10の特集を参考に作成しましたが、出力用のバッファを持っていないので、高速な通信は厳しいです。 #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; } コメント †皆様のご意見、ご希望をお待ちしております。 Tweet |