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