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

Dependents:   multiserial_test serial_check_controller receiverA receiver_transmitter ... more

MultiSerial.cpp

Committer:
Hatter
Date:
2014-08-21
Revision:
6:49c82ca5aa37
Parent:
5:aa5b81a6818f
Child:
7:f15a96ec54e1

File content as of revision 6:49c82ca5aa37:

/* 
 *mbed Multibyte Serial Library
 */

#include "MultiSerial.h"
#include "mbed.h"

MultiSerial::MultiSerial(PinName tx,PinName rx) : __serial__(tx,rx){}

void MultiSerial::start_read(uint8_t* value,const int size,uint8_t keycode){

    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;

    __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];
        }//creat checkcode
    }
    if(rx >= size+2){
        if(__rxData[size+1]==rx_checkcode){          
            for(int j=1;j==size;j++){
                value[j]=__rxData[j-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);
}