MWX Library
v0.1.9
v0.1.9
  • The MWX Library
  • 改版履歴
  • MWXライブラリについて
    • License
    • 用語
    • 設計情報
  • インストール・ビルド
    • 環境 (OSなど)
    • TWELITE SDK のインストール
    • VS Codeのインストール
    • アクトのビルド
    • アクトの実行
      • tweterm.py
    • 新しいプロジェクトの作成
    • ビルド定義 Makefile
    • 他のプラットフォーム
  • サンプルアクト
    • act0 .. 4
    • Scratch
    • Slp_Wk_and_Tx
    • Parent_MONOSTICK
    • PingPong
    • BRD_APPTWELITE
    • BRD_ARIA
    • PAL_AMB
    • PAL_AMB-usenap
    • PAL_AMB-bhv
    • PAL_MAG
    • PAL_MOT-single
    • PAL_MOT-fifo
    • PulseCounter
    • WirelessUART
    • Unit_???
  • API
    • 定義
    • クラスオブジェクト
      • the_twelite
      • Analogue
      • Buttons
      • EEPROM
      • PulseCounter
      • Serial
      • SerialParser
      • SPI
        • SPI (メンバ関数版)
        • SPI (ヘルパークラス版)
      • TickTimer
      • Timer0 .. 4
      • Wire
        • Wire (メンバ関数版)
        • Wire (ヘルパークラス版)
    • クラス
      • MWX_APIRET
      • alloc
      • axis_xyzt
      • packet_rx
      • packet_tx
      • serparser
      • pktparser
        • E_PKT
        • idenify_packet_type()
        • TwePacket
          • TwePacketTwelite
          • TwePacketIO
          • TwePacketUART
          • TwePacketPAL
      • smplbuf
        • .get_stream_helper()
        • smplbuf_strm_u8
      • smplque
      • mwx::stream
        • format (mwx::mwx_format)
        • mwx::bigendian
        • mwx::crlf
        • mwx::flush
        • stream_helper
      • SM_SIMPLE ステートマシン
    • コールバック関数
      • setup()
      • begin()
      • loop()
      • wakeup()
      • init_coldboot()
      • init_warmboot()
    • ビヘイビア
      • PAL_AMB-behavior
    • 関数
      • システム関数
        • millis()
        • delay()
        • delayMicroseconds()
        • random()
      • DIO 汎用ディジタルIO
        • pinMode()
        • digitalWrite()
        • digitalRead()
        • attachIntDio()
        • detachIntDio()
        • digitalReadBitmap()
      • ユーティリティ関数
        • Printf utils
        • pack_bits()
        • collect_bits()
        • Byte array utils
        • pack_bytes()
        • expand_bytes()
        • CRC8, XOR, LRC
        • div100()
        • Scale utils
  • ボード (BRD)
    • <BRD_APPTWELITE>
    • <MONOSTICK>
    • PAL
      • <PAL_AMB>
      • <PAL_MAG>
      • <PAL_MOT>
      • <PAL_NOTICE>
    • <CUE>
    • <ARIA>
  • センサー・デバイス (SNS)
    • SHTC3 - 温湿度センサー
    • SHT3x - 温湿度センサー
    • LTR-308ALS - 照度センサー
    • MC3630 - 加速度センサー
    • BMx280 - 環境センサー
    • PCA9632 - LEDドライバ
    • SHT4x - 温湿度センサー
  • ネットワーク (NWK)
    • シンプル中継ネット <NWK_SIMPLE>
  • 設定 (STG) - インタラクティブモード
    • <STG_STD>
GitBook提供
このページ内
  • アクトの機能
  • アクトの使い方
  • 必要なTWELITE
  • アクトの解説
  • setup()
  • loop()
  • on_rx_packet()
  • テスト用のコマンド
  • 例
  • 例
  • 例
PDFとしてエクスポート
  1. サンプルアクト

WirelessUART

前へPulseCounter次へUnit_???

最終更新 3 年前

WirelessUARTはシリアル通信を行います。

アクトの機能

  • 2台のUART接続のTWELITE同士をアスキー書式で通信する。

アクトの使い方

必要なTWELITE

PCにシリアル接続されている以下のデバイスを2台。

  • でUART接続されているなど

親機宛のパケットであればでも受信できます。

アクトの解説

setup()

void setup() {
	auto&& set = the_twelite.settings.use<STG_STD>();
	auto&& nwk = the_twelite.network.use<NWK_SIMPLE>();

	/*** INTERACTIE MODE */
	// settings: configure items
	set << SETTINGS::appname("WirelessUART");
	set << SETTINGS::appid_default(DEFAULT_APP_ID); // set default appID
	set << SETTINGS::ch_default(DEFAULT_CHANNEL); // set default channel
	set << SETTINGS::lid_default(DEFAULT_LID); // set default lid
	set.hide_items(E_STGSTD_SETID::OPT_DWORD2, E_STGSTD_SETID::OPT_DWORD3, E_STGSTD_SETID::OPT_DWORD4, E_STGSTD_SETID::ENC_KEY_STRING, E_STGSTD_SETID::ENC_MODE);
	set.reload(); // load from EEPROM.
	
	/*** SETUP section */
	// the twelite main class
	the_twelite
		<< set                      // from iteractive mode (APPID/CH/POWER)
		<< TWENET::rx_when_idle();  // open receive circuit (if not set, it can't listen packts from others)

	// Register Network
	nwk	<< set;						// from interactive mode (LID/REPEAT)

	/*** BEGIN section */
	SerialParser.begin(PARSER::ASCII, 128); // Initialize the serial parser
	the_twelite.begin(); // start twelite!

	/*** INIT message */
	Serial << "--- WirelessUart (id=" << int(nwk.get_config().u8Lid) << ") ---" << mwx::crlf;
}

インタラクティブモードを初期化しています。このサンプルでは互いに論理デバイスID(LID)が異なるデバイスを2台以上用意します。

SerialParser.begin(PARSER::ASCII, 128); 

loop()

while(Serial.available())  {
	if (SerialParser.parse(Serial.read())) {
		Serial << ".." << SerialParser;
		const uint8_t* b = SerialParser.get_buf().begin();
		uint8_t addr = *b; ++b; // the first byte is destination address.
		transmit(addr, b, SerialParser.get_buf().end());
	}
}

シリアルからのデータ入力があった時点で、シリアルパーサーに1バイト入力します。アスキー形式が最後まで受け付けられた時点でSerialParser.parse()はtrueを戻します。

SerialParserは内部バッファに対してsmplbufでアクセスできます。上の例ではバッファの1バイト目を送信先のアドレスとして取り出し、2バイト目から末尾までをtransmit()関数に渡します。

on_rx_packet()

パケットを受信したときには、送信元を先頭バイトにし続くペイロードを格納したバッファsmplbuf_u8<128> bufを生成し、出力用のシリアルパーサーserparser_attach poutからシリアルに出力しています。

void on_rx_packet(packet_rx& rx, bool_t &handled) {
	// check the packet header.
	const uint8_t* p = rx.get_payload().begin();
	if (rx.get_length() > 4 && !strncmp((const char*)p, (const char*)FOURCHARS, 4)) {
		Serial << format("..rx from %08x/%d", rx.get_addr_src_long(), rx.get_addr_src_lid()) << mwx::crlf;

		smplbuf_u8<128> buf;
		mwx::pack_bytes(buf			
				, uint8_t(rx.get_addr_src_lid())            // src addr (LID)
				, make_pair(p+4, rx.get_payload().end()) );	// data body

		serparser_attach pout;
		pout.begin(PARSER::ASCII, buf.begin(), buf.size(), buf.size());
		Serial << pout;
	}
}

テスト用のコマンド

テストデータは必ずペースト機能を用いてターミナルに入力してください。入力にはタイムアウトがあるためです。

参考: TWE ProgrammerやTeraTermでのペーストはAlt+Vを用います。

入力の末尾にCR LFが必要です。

最初はCR LFが省略できるXで終わる系列を試してください。終端文字列が入力されない場合は、その系列は無視されます。

例

:FE00112233X

:FE001122339C

任意の子機宛に00112233を送付します。

例

:03AABBCC00112233X

:03AABBCC0011223366

子機3番に対してAABBCC00112233を送付します。

例

:FF00112233X

:00112233X

任意の親機または子機宛(0xFF)、親機宛(0x00)に送付します。

を初期化します。

MONOSTICK BLUE または RED
TWELITE R
TWELITE DIP
Parent_MONOSTICK
シリアルパーサー