セクションの複数ページをまとめています。 印刷またはPDF形式で保存...

もとのページに戻る

2024-05-14 現在

WirelessUART

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

    アクトの機能

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

    アクトの使い方

    必要なTWELITE

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

    アクトの解説

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

    テスト用のコマンド

    :FE00112233X
    
    :FE001122339C
    

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

    :03AABBCC00112233X
    
    :03AABBCC0011223366
    

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

    :FF00112233X
    
    :00112233X
    

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