uint8_t型とunsigned char型に対応した多バイトシリアル通信用ライブラリ
Dependents: multiserial_test serial_check_controller receiverA receiver_transmitter ... more
Revision 7:f15a96ec54e1, committed 2014-08-28
- Comitter:
- Hatter
- Date:
- Thu Aug 28 04:57:01 2014 +0000
- Parent:
- 6:49c82ca5aa37
- Child:
- 8:cfc53cc4914a
- Commit message:
- ????????
Changed in this revision
MultiSerial.cpp | Show annotated file Show diff for this revision Revisions of this file |
MultiSerial.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/MultiSerial.cpp Thu Aug 21 21:29:25 2014 +0000 +++ b/MultiSerial.cpp Thu Aug 28 04:57:01 2014 +0000 @@ -2,97 +2,81 @@ *mbed Multibyte Serial Library */ +#include "mbed.h" #include "MultiSerial.h" -#include "mbed.h" -MultiSerial::MultiSerial(PinName tx,PinName rx) : __serial__(tx,rx){} + MultiSerial::MultiSerial(PinName tx,PinName rx) : __serial__(tx,rx){} + + void MultiSerial::read(uint8_t* readData,uint8_t readKey){ -void MultiSerial::start_read(uint8_t* value,const int size,uint8_t keycode){ + __readData = readData; + __readSize = __SIZE(__readData); + __readKey = readKey; + __serial__.attach(this,&MultiSerial::RX,Serial::RxIrq); + uint8_t k = __serial__.getc(); + } + + + void MultiSerial::write(uint8_t* writeData,uint8_t writeKey){ - static int rx=0, i; - static uint8_t __rxData[MAX_DATA_NUM]; - for(int l=0;l<size+2;l++){__rxData[l]=0;} - static uint8_t rx_checkcode=0; + __writeData=writeData; + __writeSize = __SIZE(__writeData); + __writeKey = writeKey; + __serial__.attach(this,&MultiSerial::TX,Serial::TxIrq); + __serial__.putc(1); + } + + + void MultiSerial::TX(void){//送信バッファ空き割り込み用関数 - __rxData[rx] = __serial__.getc(); + static uint8_t tx=__writeSize+2, i; + static uint8_t txData[MAX_DATA_NUM]={__writeKey}; + static uint8_t tx_checkcode=0; + if(tx >= __writeSize+2){ + txData[KEY] = __writeKey;; + + for(int k=1;k<=__writeSize;k++){ + txData[k] = __writeData[k-1]; + } - if(__rxData[0]==keycode){ - rx++; - } - if(rx==size+1){ - for(i=1, rx_checkcode=0; i<size+1; i++){ - rx_checkcode ^= __rxData[i]; - }//creat checkcode - } - if(rx >= size+2){ - if(__rxData[size+1]==rx_checkcode){ - for(int j=1;j==size;j++){ - value[j]=__rxData[j-1]; + //送るデータ = センサ等のデータ + for(i=KEY+1, tx_checkcode=0; i<__writeSize+1; i++){ + tx_checkcode ^= txData[i]; + }//CHECKCODE作成 + txData[__writeSize+1] = tx_checkcode; + tx=0; + } + __serial__.putc(txData[tx]); + tx++; + }//受信割り込み用関数 + + void MultiSerial::RX(void){ + + static uint8_t rx=0, i; + static uint8_t rxData[MAX_DATA_NUM]={__readKey}; + static uint8_t rx_checkcode=0; + + rxData[rx] = __serial__.getc(); + + if(rxData[KEY]==__readKey){ + rx++; } - }else{ + if(rx==__readSize+1){ + for(i=KEY+1, rx_checkcode=0; i<__readSize+1; i++){ + rx_checkcode ^= rxData[i]; + }//CHECKCODE作成 + } - error("serial data is lost\n"); - } - rx=0; - } -} + if(rx >= __readSize+2){ + if(rxData[__readSize+1]==rx_checkcode){ -void MultiSerial::start_write(uint8_t* value,const int size,uint8_t keycode){ - static int tx=size+2; - static uint8_t __txData[MAX_DATA_NUM]; - for(int m=0;m<size+2;m++){__txData[m]=0;} - static uint8_t tx_checkcode=0; + for(int m=1;m<=__readSize;m++){ + __readData[m-1] = rxData[m]; + } - if(tx >= size+2){ - - __txData[0]=keycode; - for(int k=1;k==size;k++){ - __txData[k]=value[k-1]; + //使うデータ = 受け取ったデータ + } + rx=0; + } } - //send data = sensor data etc.. - for(int i=1, tx_checkcode=0; i<(size+1); i++){ - tx_checkcode ^= __txData[i]; - }//checkcode - __txData[size+1] = tx_checkcode; - tx=0; - } - __serial__.putc(__txData[tx]); - tx++; -} -/* - void writeAttach(void (*func)()){ - __serial__.attach(func,Serial::TxIrq); - } - - void readAttach(void(*func)()){ - __serial__.attach(func,Serial::RxIrq); - } - */ - -void MultiSerial::RX(){ - start_read(__readData,__readSize,__readKey); - -} - -void MultiSerial::TX(){ - start_write(__writeData,__writeSize,__writeKey); - -} - -void MultiSerial::read(uint8_t* value,uint8_t keycode){ - __readData=value; - __readSize=__SIZE(value); - __readKey=keycode; - __serial__.attach(this,&MultiSerial::RX,Serial::RxIrq); - int _i =__serial__.getc(); -} - -void MultiSerial::write(uint8_t* value,uint8_t keycode){ - __writeData=value; - __writeSize=__SIZE(value); - __writeKey=keycode; - - __serial__.attach(this, &MultiSerial::TX, Serial::TxIrq); - __serial__.putc(1); -}
--- a/MultiSerial.h Thu Aug 21 21:29:25 2014 +0000 +++ b/MultiSerial.h Thu Aug 28 04:57:01 2014 +0000 @@ -2,17 +2,18 @@ *mbed Multibyte Serial Library *This comment is available in Japanese only */ - - + -#ifndef MBED_MULTISERIAL -#define MBED_MULTISERIAL +#ifndef MULTISERIAL_H +#define MULTISERIAL_H -#include"mbed.h" +#include "mbed.h" #define __SIZE(array) (sizeof(array) / sizeof(array[0])) -#define MAX_DATA_NUM 30 + +#define MAX_DATA_NUM 10 +#define KEY 0//number of first data /** 多バイト通信用クラス * @@ -37,74 +38,57 @@ * @endcode */ - -class MultiSerial { +class MultiSerial{ public: - + /** 多バイト通信用オブジェクト作成 Serialにそのままつなげるよ * * @param tx Serial tx pin * @param rx Serial rx pin - */ + */ + MultiSerial(PinName tx,PinName rx); - + /**データ読み込みするよ * - * @param value 読み込み先の配列アドレス - * @param size 配列の要素数 - * @param keycode 多バイト通信のキーコード - */ - void start_read(uint8_t* value,int size,uint8_t keycode); - - /**データカキコするよ - * - * @param value 送るデーターの配列アドレス - * @param size 配列の要素数 - * @param keycode 多バイト通信のキーコード + * @param readData 読み込み先の配列アドレス + * @param readKey 多バイト通信のキーコード */ - void start_write(uint8_t* value,int size,uint8_t keycode); - /* - void writeAttach(void (*func)()){ - __serial__.attach(func,Serial::TxIrq); - } + void read(uint8_t* readData,uint8_t readKey); + + /**データカキコするよ + * + * @param writeData 送るデーターの配列アドレス + * @param writeKey 多バイト通信のキーコード + */ - void readAttach(void(*func)()){ - __serial__.attach(func,Serial::RxIrq); - } - */ - /**シリアル通信 受信割り込み ルーチン - * @param none - */ - void RX(void); - /**シリアル通信 送信バッファ空き割り込みルーチン - * @param none + void write(uint8_t* writeData,uint8_t writeKey); + + /**送信割り込み用関数 + * + *@param none */ void TX(void); - - /** データ読み込み起動するよ + /**受信割り込み用関数 * - * @param value 読み込み先の配列アドレス - * @param keycode 多バイト通信のキーコード - */ - void read(uint8_t* value,uint8_t keycode); - /**データカキコ起動するよ - * - * @param value 送信データの配列アドレス - * @param keycode 多バイト通信のキーコード - */ - - void write(uint8_t* value,uint8_t keycode); + *@param none + */ + void RX(void); + protected: Serial __serial__; - uint8_t *__readData; - uint8_t *__writeData; - int __readSize; - int __writeSize; - uint8_t __readKey; - uint8_t __writeKey; + + volatile uint8_t* __readData; + volatile uint8_t __readSize; + volatile uint8_t __readKey; + + volatile uint8_t* __writeData; + volatile uint8_t __writeSize; + volatile uint8_t __writeKey; + }; -#endif +#endif \ No newline at end of file