920MHz帯無線通信モジュールIM920のライブラリ
Dependents: Hybrid_OB2021_MAIN Hybrid_OB2021_GROUND pressure_control_system pressure_control_receiver ... more
IM920.h
00001 #ifndef _IM920_H_ 00002 #define _IM920_H_ 00003 #include "mbed.h" 00004 00005 #define IM920_BUFF_SIZE 160 00006 00007 const int FUNC_NUMBER = 256; 00008 00009 00010 typedef enum im920_buff_classify{ 00011 BUFF_A = 0, 00012 BUFF_B = 1 00013 }IM920_Buff_Classify; 00014 00015 //解析方法に関する変数 00016 const int WAIT_TIME_US = 1000; 00017 typedef enum{ 00018 DATA_STRING = 0, //データの文字列 00019 RESPONSE_STRING = 1, //OKかNGのレスポンスの文字列 00020 NORMAL_STRING = 2, 00021 OTHER_STRING = 3, 00022 RECEIVE_ID = 4, 00023 INTERACTIVE_STRING = 5 00024 }IM920_Analyze_Selector; 00025 00026 00027 00028 static IM920_Buff_Classify AB = BUFF_A; 00029 00030 class IM920{ 00031 public: 00032 IM920(Serial &serial, Serial &pc, int baudrate = 19200); 00033 private: 00034 Serial *ser; 00035 Serial *_pc; 00036 00037 //バッファ関連の変数 00038 char buff_A[IM920_BUFF_SIZE]; 00039 char buff_B[IM920_BUFF_SIZE]; 00040 char* readBuffAddr; 00041 char* writeBuffAddr; 00042 00043 00044 char im920_dataLength; 00045 char im920_sendBuff[129]; 00046 00047 int nodeNumber; 00048 //インタラクティブモードから復帰できるかを示すフラグ 00049 //1ならインタラクティブモード、0なら通常モード 00050 int interactiveFlag; 00051 00052 IM920_Analyze_Selector AS; 00053 00054 public: 00055 00056 union IM920_CAST{ 00057 double d; 00058 float f; 00059 long l; 00060 int i; 00061 short s; 00062 char c; 00063 char u[8]; 00064 }; 00065 union IM920_CAST im920_cast; 00066 00067 char data[64]; 00068 int sendDataSize; 00069 void (*p_callFunc[256])(void); 00070 char node; 00071 char RSSI;//受信強度 00072 int rID;//受信した送信機ID 00073 int ID; //自分の固有ID 00074 00075 /** 00076 @note 無線機の設定を変更するわけではない 00077 @bref IM920XSとの通信ボーレート変更 00078 @param baudrate 1200,2400,4800,9600,19200,38400,57600 or 115200 00079 */ 00080 void baud(int baudrate){ 00081 ser->baud(baudrate); 00082 } 00083 00084 /** 00085 @bref インタラクティブモードへ移行する,@で復帰 00086 */ 00087 void interactiveMode(); 00088 00089 /** 00090 @bref 16進数文字列データから数値データを取得します 00091 */ 00092 void data_analyze(); 00093 00094 /** 00095 @bref データ処理関数を設定 00096 @param *funcAddr 関数ポインタ、void型引数無し関数のみ設定可 00097 @param header 関数を選択する0~255のヘッダー 00098 */ 00099 void attach(void (*funcAddr)(void), unsigned header); 00100 00101 /** 00102 @bref パラメータ不揮発メモリ書き込み許可モードへ移行 00103 */ 00104 bool enableWrite(); 00105 00106 /** 00107 @bref パラメータ不揮発メモリ書き込み不許可モードへ移行 00108 */ 00109 bool disableWrite(); 00110 00111 /** 00112 @bref 固有IDを読み出す 00113 */ 00114 int readID(); 00115 00116 /** 00117 @bref ノード番号をセットする 00118 */ 00119 bool setNodeNumber(char nodeNum); 00120 00121 /** 00122 @bref ノード番号を読み出す 00123 */ 00124 int readNodeNumber(); 00125 00126 /** 00127 @bref 受信する無線機IDを一つ登録する 00128 */ 00129 bool setReceiveID(int ID); 00130 00131 /** 00132 @bref 登録されている受信IDを表示する 00133 */ 00134 void readReceiveID(); 00135 00136 /** 00137 @bref 登録されている受信IDを全消去する 00138 */ 00139 bool eraseReceiveID(); 00140 00141 /** 00142 @bref 使用する周波数chを設定する 00143 */ 00144 bool setChannel(char ch); 00145 00146 /** 00147 @bref 使用する周波数chを読み出す 00148 */ 00149 char readChannel(); 00150 00151 /** 00152 @bref アスキーコードの文字列で送受信ができるようにする 00153 */ 00154 bool enableCharacterIO(); 00155 00156 /** 00157 @bref バイナリ送受信モードへ移行 00158 */ 00159 bool disableCharacterIO(); 00160 00161 /** 00162 @bref 送信バッファにdouble型を一つ入れる 00163 */ 00164 void write(double val); 00165 00166 /** 00167 @bref 送信バッファにlong型を一つ入れる 00168 */ 00169 void write(long val); 00170 00171 /** 00172 @bref 送信バッファにfloat型を一つ入れる 00173 */ 00174 void write(float val); 00175 /** 00176 @bref 送信バッファにint型を一つ入れる 00177 */ 00178 void write(int val); 00179 00180 /** 00181 @bref 送信バッファにshort型を一つ入れる 00182 */ 00183 void write(short val); 00184 00185 /** 00186 @bref 送信バッファにchar型を一つ入れる 00187 */ 00188 void write(char val); 00189 00190 /** 00191 @bref 送信バッファにfloat型を複数入れる 00192 */ 00193 // void write(float *array, int count); 00194 00195 template <typename T> void write(T *array, int count){ 00196 for(int i = 0;i < count; i++){ 00197 write(array[i]); 00198 } 00199 } 00200 /** 00201 @bref 送信バッファを送信する 00202 */ 00203 void send(); 00204 00205 /** 00206 @bref 送信バッファにヘッダーを付ける、writeする前に使う 00207 */ 00208 void header(char headerNumber){ 00209 write(headerNumber); 00210 } 00211 00212 /** 00213 @bref デバッグ用、受信バッファを表示 00214 */ 00215 void im920_debug(); 00216 00217 /** 00218 @bref インタラクティブモードでコマンドを表示する 00219 */ 00220 void printFormat(); 00221 00222 /** 00223 @bref データ配列をshort型に変換する 00224 @param array データのchar型配列、データの始まるアドレスを入れる 00225 */ 00226 short toShort(char *array); 00227 short toShort(int i){ 00228 return toShort(&data[i]); 00229 } 00230 00231 /** 00232 @bref データ配列をint型に変換する 00233 @param array データのchar型配列、データの始まるアドレスを入れる 00234 */ 00235 int toInt(char *array); 00236 int toInt(int i){ 00237 return toInt(&data[i]); 00238 } 00239 /** 00240 @bref データ配列をfloat型に変換する 00241 @param array データのchar型配列、データの始まるアドレスを入れる 00242 */ 00243 float toFloat(char *array); 00244 float toFloat(int i){ 00245 return toFloat(&data[i]); 00246 } 00247 /** 00248 @bref データ配列をlong型に変換する 00249 @param array データのchar型配列、データの始まるアドレスを入れる 00250 */ 00251 long toLong(char *array); 00252 long toLong(int i){ 00253 return toLong(&data[i]); 00254 } 00255 00256 /** 00257 @bref データ配列をdouble型に変換する 00258 @param array データのchar型配列、データの始まるアドレスを入れる 00259 */ 00260 double toDouble(char *array); 00261 double toDouble(int i){ 00262 return toDouble(&data[i]); 00263 } 00264 /** 00265 @bref チェックサムを計算する 00266 @param count データの個数、何byteか 00267 */ 00268 char im920CheckSum(int count); 00269 00270 /** 00271 @bref 受信データのチェックサムの計算結果を入れる 00272 */ 00273 char receiveCheckSum; 00274 00275 private: 00276 00277 /** 00278 @bref 1文字受信するごとに呼ばれ、受信バッファに入れる 00279 */ 00280 void im920Handler(); 00281 00282 char checkSum; 00283 00284 /** 00285 @bref 何もしない関数 00286 */ 00287 static void dummyFunc(void); 00288 00289 /** 00290 @bref 16進数文字を数値に変換する関数 00291 */ 00292 int asciiToNumber(char c); 00293 }; 00294 00295 inline void IM920::write(double val){ 00296 if(sendDataSize <= 56){ 00297 im920_cast.d = val; 00298 sprintf(im920_sendBuff, "%s%02X%02X%02X%02X%02X%02X%02X%02X", im920_sendBuff, im920_cast.u[0], im920_cast.u[1], im920_cast.u[2] 00299 , im920_cast.u[3], im920_cast.u[4], im920_cast.u[5], im920_cast.u[6], im920_cast.u[7]); 00300 sendDataSize += 8; 00301 checkSum = checkSum ^ im920_cast.u[7] ^ im920_cast.u[6] ^ im920_cast.u[5] ^ im920_cast.u[4] ^ im920_cast.u[3] ^ im920_cast.u[2] ^ im920_cast.u[1] ^ im920_cast.u[0]; 00302 } 00303 } 00304 00305 inline void IM920::write(long val){ 00306 if(sendDataSize <= 56){ 00307 im920_cast.l = val; 00308 sprintf(im920_sendBuff, "%s%02X%02X%02X%02X%02X%02X%02X%02X", im920_sendBuff, im920_cast.u[0], im920_cast.u[1], im920_cast.u[2] 00309 , im920_cast.u[3], im920_cast.u[4], im920_cast.u[5], im920_cast.u[6], im920_cast.u[7]); 00310 sendDataSize += 8; 00311 checkSum = checkSum ^ im920_cast.u[7] ^ im920_cast.u[6] ^ im920_cast.u[5] ^ im920_cast.u[4] ^ im920_cast.u[3] ^ im920_cast.u[2] ^ im920_cast.u[1] ^ im920_cast.u[0]; 00312 } 00313 } 00314 00315 inline void IM920::write(float val){ 00316 if(sendDataSize <= 60){ 00317 im920_cast.f = val; 00318 sprintf(im920_sendBuff, "%s%02X%02X%02X%02X", im920_sendBuff, im920_cast.u[0],im920_cast.u[1],im920_cast.u[2],im920_cast.u[3]); 00319 sendDataSize += 4; 00320 checkSum = checkSum ^ im920_cast.u[3] ^ im920_cast.u[2] ^ im920_cast.u[1] ^ im920_cast.u[0]; 00321 } 00322 } 00323 inline void IM920::write(int val){ 00324 if(sendDataSize <= 60){ 00325 im920_cast.i = val; 00326 sprintf(im920_sendBuff, "%s%08X", im920_sendBuff, (uint32_t)val); 00327 sendDataSize += 4; 00328 checkSum = checkSum ^ im920_cast.u[3] ^ im920_cast.u[2] ^ im920_cast.u[1] ^ im920_cast.u[0]; 00329 } 00330 } 00331 inline void IM920::write(short val){ 00332 if(sendDataSize <= 62){ 00333 im920_cast.s = val; 00334 sprintf(im920_sendBuff, "%s%04X", im920_sendBuff, (uint16_t)val); 00335 sendDataSize += 2; 00336 checkSum = checkSum ^ im920_cast.u[1] ^ im920_cast.u[0]; 00337 } 00338 } 00339 inline void IM920::write(char val){ 00340 if(sendDataSize < 64){ 00341 im920_cast.c = val; 00342 sprintf(im920_sendBuff, "%s%02X", im920_sendBuff, (uint8_t)val); 00343 sendDataSize += 1; 00344 checkSum = im920_cast.u[0] ^ '0'; 00345 } 00346 } 00347 /* 00348 inline void IM920::write(float *array, int count){ 00349 if(sendDataSize < (64 - (4*count))){ 00350 for(int i = 0; i < count; i++){ 00351 write((float)array[i]); 00352 } 00353 } 00354 }*/ 00355 00356 inline void IM920::send(){ 00357 if(sendDataSize > 0){ 00358 AS = RESPONSE_STRING; 00359 //write(checkSum); 00360 //sprintf(im920_sendBuff, "%s%02X", im920_sendBuff, checkSum); 00361 im920_sendBuff[128] = '\0';//もしバッファがあふれて文字列になっていなかったら 00362 ser->printf("TXDA %s\r\n", im920_sendBuff); 00363 //printf("send -> TXDA %s\r\n", im920_sendBuff); 00364 sendDataSize = 0;//初期化 00365 memset(im920_sendBuff, '\0', 129); 00366 AS = DATA_STRING; 00367 } 00368 } 00369 00370 #endif
Generated on Tue Jul 26 2022 04:07:01 by
1.7.2