lbed

2013/07/20からのアクセス回数 1341

あると便利シリアルポート

lbedは、LPCXpresso IDEのソースレベルのデバッグができるので、mbedよりもPCと シリアルで接続する機会は少ないとは思うのですが、はやりあると便利なシリアル通信です。

初心者もベテランもArduino IDEのシリアルモニター

やはり、Arduinoは良く出来ており、組み込み機器とPCをつないで使うには、Arduino IDEの シリアルモニターが便利です。

PCから文字を入力する場合には、トップのテキストフィールドに文字を入力し、送信ボタンを押します。 組み込み機器からの文字列は、その下のテキストエリアに表示されます。

SerialMonitor.png

テストプログラム

シリアル通信を行うクラスは、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

SerialSetting.png

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;
}

コメント

選択肢 投票
おもしろかった 0  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。


(Input image string)


*1 文字出力がちょっと不安定です。
*2 MyARMの作成時にUSBコネクターのはんだに失敗して、上手くMyARM上でのUSBシリアル通信ができなかったので、別途USBシリアル変換器を購入しました(恥ずかしい)

添付ファイル: fileSerialMonitor.png 334件 [詳細] fileSerialSetting.png 343件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-07-21 (日) 14:08:54 (1435d)
SmartDoc