uint8_t型とunsigned char型に対応した多バイトシリアル通信用ライブラリ

Dependents:   multiserial_test serial_check_controller receiverA receiver_transmitter ... more

Files at this revision

API Documentation at this revision

Comitter:
Hatter
Date:
Thu Aug 21 21:29:25 2014 +0000
Parent:
5:aa5b81a6818f
Child:
7:f15a96ec54e1
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 02:23:38 2014 +0000
+++ b/MultiSerial.cpp	Thu Aug 21 21:29:25 2014 +0000
@@ -5,92 +5,94 @@
 #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::start_read(uint8_t* value,int size,uint8_t keycode){
+void MultiSerial::start_read(uint8_t* value,const int size,uint8_t keycode){
 
-            uint8_t rx=0, i;
-            uint8_t rxData[size+2];
-                for(int l=0;l<size+2;l++){rxData[l]=0;}
-            uint8_t rx_checkcode=0;
-            
-            rxData[rx] = __serial__.getc();
-            
-            if(rxData[0]==keycode){
-                rx++;
-            }
-            if(rx==size+1){
-                for(i=1, rx_checkcode=0; i<size+1; i++){
-                    rx_checkcode ^= rxData[i];
-                }//checkcode作成
-            }
-            if(rx >= size+2){
-                if(rxData[size+1]==rx_checkcode){          
-                    for(int j=1;j==size;j++){
-                        value[j]=rxData[j-1];
-                    }
-                }else{
+    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;
 
-                    error("serial data is lost\n");
-                }
-                rx=0;
-            }    
-        }
+    __rxData[rx] = __serial__.getc();
 
-        void MultiSerial::start_write(uint8_t* value,int size,uint8_t keycode){
-            uint8_t tx=size+2, i;
-            uint8_t txData[size+2];
-                for(int m=0;i<size+2;m++){txData[m]=0;}   
-            uint8_t tx_checkcode=0;
-            
-            if(tx >= size+2){
-                txData[0]=keycode;
-                for(int k=1;k==size;k++){
-                    txData[k]=value[k-1];
-                }
-                //送るデータ = センサ等のデータ
-                for(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);
-             
+    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];
             }
 
-        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);
-            }
+        }else{
+
+            error("serial data is lost\n");
+        }
+        rx=0;
+    }    
+}
+
+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;
+
+    if(tx >= size+2){
+        
+        __txData[0]=keycode;
+        for(int k=1;k==size;k++){
+            __txData[k]=value[k-1];
+        }
+        //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 02:23:38 2014 +0000
+++ b/MultiSerial.h	Thu Aug 21 21:29:25 2014 +0000
@@ -12,6 +12,8 @@
 
 #define __SIZE(array) (sizeof(array) / sizeof(array[0]))
 
+#define MAX_DATA_NUM 30
+
 /** 多バイト通信用クラス 
  *
  * Example:
@@ -39,71 +41,70 @@
 class MultiSerial {
 
     public:
-    
-       /** 多バイト通信用オブジェクト作成 Serialにそのままつなげるよ
-        *
-        * @param tx Serial tx pin
-        * @param rx Serial rx pin
-        */  
+
+        /** 多バイト通信用オブジェクト作成 Serialにそのままつなげるよ
+         *
+         * @param tx Serial tx pin
+         * @param rx Serial rx pin
+         */  
         MultiSerial(PinName tx,PinName rx);
-        
-       /**データ読み込みするよ 
-        *
-        * @param value 読み込み先の配列アドレス
-        * @param size 配列の要素数
-        * @param keycode 多バイト通信のキーコード
-        */
+
+        /**データ読み込みするよ 
+         *
+         * @param value 読み込み先の配列アドレス
+         * @param size 配列の要素数
+         * @param keycode 多バイト通信のキーコード
+         */
         void start_read(uint8_t* value,int size,uint8_t keycode);
 
-       /**データカキコするよ
-        *
-        * @param value 送るデーターの配列アドレス
-        * @param size 配列の要素数
-        * @param keycode 多バイト通信のキーコード
-        */
+        /**データカキコするよ
+         *
+         * @param value 送るデーターの配列アドレス
+         * @param size 配列の要素数
+         * @param keycode 多バイト通信のキーコード
+         */
 
         void start_write(uint8_t* value,int size,uint8_t keycode);
-/*        
-        void writeAttach(void (*func)()){
-             __serial__.attach(func,Serial::TxIrq);
-            }
-            
-        void readAttach(void(*func)()){     
-        __serial__.attach(func,Serial::RxIrq);
-            }
-*/          
+        /*        
+          void writeAttach(void (*func)()){
+          __serial__.attach(func,Serial::TxIrq);
+          }
+
+          void readAttach(void(*func)()){     
+          __serial__.attach(func,Serial::RxIrq);
+          }
+          */          
         /**シリアル通信 受信割り込み ルーチン 
-        * @param none
-        */           
+         * @param none
+         */           
         void RX(void);
-       /**シリアル通信 送信バッファ空き割り込みルーチン
-        * @param none
-        */
+        /**シリアル通信 送信バッファ空き割り込みルーチン
+         * @param none
+         */
         void TX(void);
-           
-       /** データ読み込み起動するよ
-        *
-        * @param value 読み込み先の配列アドレス
-        * @param keycode 多バイト通信のキーコード
-        */            
+
+        /** データ読み込み起動するよ
+         *
+         * @param value 読み込み先の配列アドレス
+         * @param keycode 多バイト通信のキーコード
+         */            
         void read(uint8_t* value,uint8_t keycode);
-       /**データカキコ起動するよ 
-        *
-        * @param value 送信データの配列アドレス
-        * @param keycode 多バイト通信のキーコード
-        */            
+        /**データカキコ起動するよ 
+         *
+         * @param value 送信データの配列アドレス
+         * @param keycode 多バイト通信のキーコード
+         */            
 
         void write(uint8_t* value,uint8_t keycode);
-        
-protected:
-  
-    Serial __serial__;
-    uint8_t *__readData;
-    uint8_t *__writeData;
-    int __readSize;
-    int __writeSize;
-    uint8_t __readKey;
-    uint8_t __writeKey;
-    
+
+    protected:
+
+        Serial __serial__;
+        uint8_t *__readData;
+        uint8_t *__writeData;
+        int __readSize;
+        int __writeSize;
+        uint8_t __readKey;
+        uint8_t __writeKey;
 };
 #endif