XbeeApi
Dependents: XbeeAPI Hybrid_main_FirstEdtion
Diff: XbeeApiLib.cpp
- Revision:
- 1:34007fc9235e
- Parent:
- 0:bca23ad9e6b5
- Child:
- 2:30220fb0e20e
--- a/XbeeApiLib.cpp Fri Jan 20 08:13:54 2017 +0000 +++ b/XbeeApiLib.cpp Fri Mar 10 06:08:40 2017 +0000 @@ -2,7 +2,7 @@ #include <XbeeApiLib.h> #include <string> -XbeeApi::XbeeApi(PinName Tx, PinName Rx, int BaudRate) : Xbee(Tx, Rx, BaudRate){ +XbeeApi::XbeeApi(PinName Tx, PinName Rx, int BaudRate, void (*onPacketReceived)(int, char*)) : Xbee(Tx, Rx, BaudRate){ //Xbee = Serial(Tx, Rx, BaudRate); //Xbee.baud(BaudRate); @@ -11,6 +11,8 @@ address[i].IsAvailable = false; } IsTransmitting = false; + SetInterrupt(true); + OnPacketReceived = onPacketReceived; } void XbeeApi::SetAddress(int Num, unsigned long HIGH, unsigned long LOW){ @@ -18,7 +20,7 @@ address[Num].ADR[3 - i] = reinterpret_cast<char (&)[sizeof(HIGH)]>(HIGH)[i]; address[Num].ADR[7 - i] = reinterpret_cast<char (&)[sizeof(LOW)]>(LOW)[i]; } - address[Num].IsAvailable = true; + address[Num].IsAvailable = false; address[Num].sum = 0; //EndPacket()でチェックサムを計算する際、宛先アドレスもチェックサムに含まれる //宛先アドレスは頻繁に変更されないので、アドレス分の合計だけを先にまとめて計算しておく @@ -66,6 +68,20 @@ } } +//long型の数値をバイト列として書き込む +//リトルエンディアン(位の大きい数字ほどバイト列では後ろになる)であることに注意 +void XbeeApi::Write(long long val){ + if(sizeof(val) < 128 - itr){ + for(int i = 0;i < sizeof(val);i++){ + buf[itr + i] = reinterpret_cast<char (&)[sizeof(val)]>(val)[i]; + } + itr += sizeof(val); + }else{ + buf[17] = 0x00; + EndPacket(); + } +} + //double型の数値をバイト列として書き込む //リトルエンディアン(位の大きい数字ほどバイト列では後ろになる)であることに注意 void XbeeApi::Write(double val){ @@ -94,40 +110,6 @@ } } -/*void XbeeApi::EndPacket(){ - if(itr != 0){ - CheckSum += 0x12; - for(int i = 0;i < itr;i++){ - CheckSum += buf[i]; - } - for(int i = 0; i < 4;i++){ - if(address[i].IsAvailable == true){ - Xbee.putc(0x7E); //パケットの先頭を表す - WriteWithEsc((char)(itr + 14) >> 8); - WriteWithEsc((char)(itr + 14) & 0x00FF); - WriteWithEsc(0x10); - WriteWithEsc(0x00); //ここを01にするとxbeeは送信の成否の判定を行うようになる(クソ重い) - //宛先アドレスを書き込む - for(int j = 0;j < 8;j++){ - WriteWithEsc(address[i].ADR[j]); - } - WriteWithEsc(address[i].ADR16bit[0]); - WriteWithEsc(address[i].ADR16bit[1]); - WriteWithEsc(0x01); - WriteWithEsc(0x01); - //データを書き込む - for(int j = 0;j < itr;j++){ - WriteWithEsc(buf[j]); - } - //チェックサムを書き込む - WriteWithEsc((char)(0xFF - (CheckSum + address[i].sum + address[i].ADR16bit[0] + address[i].ADR16bit[1]) & 0xFF)); - } - } - CheckSum = 0; - itr = 0; - } -}*/ - void XbeeApi::EndPacket(){ if(itr != 0){ buf[0] = 0x7E; //パケットの先頭を表す @@ -202,7 +184,6 @@ //データ受信時の処理 1バイトごとに呼び出される必要がある void XbeeApi::OnDataReceived(){ - static DigitalOut LED(LED1); static bool EscFlag = false; static int PacketLength = 0; static bool IsReceivingPacket = false; @@ -226,31 +207,32 @@ RxBuf[ReceivedBytesCounter] = message; } ReceivedBytesCounter++; + if(ReceivedBytesCounter >= 256){ + IsReceivingPacket = false; //受信バッファを溢れる場合は、パケットの読み込みを中止する 次に0x7Eを受信するまで再開されない + } } //この時点でReceivedBytesCounterには受信したデータのバイト数が入っている //2バイト目と3バイト目はパケットの長さを表している if(RxBuf[0] == 0x7E){ - if(ReceivedBytesCounter == 3){ + if(ReceivedBytesCounter == 3){ //パケットの3バイト目までを受信した時点で、パケットの長さを計算できる PacketLength = 255 * RxBuf[1] + RxBuf[2]; } - if(ReceivedBytesCounter > 3 && ReceivedBytesCounter == PacketLength + 4){ + if(ReceivedBytesCounter > 3 && ReceivedBytesCounter == PacketLength + 4){ //パケットの長さと同じだけのデータを受信したら int sum = 0; for(int i = 3; i < ReceivedBytesCounter - 1; i++){ //先頭3バイトとチェックサム以外のすべてのバイトを合計 sum += RxBuf[i]; } - if((char)(0xFF - sum & 0xFF) == RxBuf[ReceivedBytesCounter - 1]){ + if((char)(0xFF - sum & 0xFF) == RxBuf[ReceivedBytesCounter - 1]){ //チェックサムが一致するならば //ここにデータ受信時の処理を書く //パケット受信直後なので、多少時間のかかる処理でも問題ないはず - if(RxBuf[3] == 0x90){ - int DataLength = PacketLength - 12; - //パケットタイプ0x90は地上局から送信されたデータが16バイト目 すなわち RxBuf[15] から格納されている + if(RxBuf[3] == 0x90){ // パケットタイプ0x90は他のXbeeから送信されたデータを表す + int DataLength = PacketLength - 12; //データ本体の長さは パケットの長さ - 12 ここでいう「パケットの長さ」に、最初の3バイトとチェックサムは含まない + OnPacketReceived(DataLength, &RxBuf[15]); //パケットタイプ0x90は地上局から送信されたデータが16バイト目 すなわち RxBuf[15] から格納されている + //OnPacketReceived(DataLength + 16, RxBuf); //デバッグ用 パケットすべてを渡す場合 if(DataLength == 2 && RxBuf[15] == 0x59 && RxBuf[16] == 0x4D){ - LED = !LED; address[0].ADR16bit[0] = RxBuf[12]; address[0].ADR16bit[1] = RxBuf[13]; - } - if(DataLength == 2 && RxBuf[15] == 0x5E){ - + address[0].IsAvailable = true; } } } @@ -265,6 +247,8 @@ Xbee.attach(callback(this, &XbeeApi::OnDataReceived), Serial::RxIrq); Xbee.attach(callback(this, &XbeeApi::OnTransmitEnabled), Serial::TxIrq); }else{ + Xbee.attach(NULL, Serial::RxIrq); + Xbee.attach(NULL, Serial::TxIrq); } }