Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: multiserial_test serial_check_controller receiverA receiver_transmitter ... more
MultiSerial.cpp
- Committer:
- bousiya03
- Date:
- 2014-10-15
- Revision:
- 25:1df5616cc007
- Parent:
- 24:0ca02e8c37e5
File content as of revision 25:1df5616cc007:
/* 
 *mbed Multibyte Serial Library
 */
#include "mbed.h"
#include "MultiSerial.h"
#include "RawSerial.h"
    
        MultiSerial::MultiSerial(PinName tx,PinName rx) : __serial__(tx,rx){}
    
        void MultiSerial::start_write(){
            
            __serial__.attach(this,&MultiSerial::TX,RawSerial::TxIrq);
            __serial__.putc(1);
            
            }
               
        void MultiSerial::start_read(){
            __serial__.attach(this,&MultiSerial::RX,RawSerial::RxIrq);
            uint8_t k = __serial__.getc();
            
            __first_bit = k;
            
            }
            
        void MultiSerial::read_data(uint8_t* readData,uint8_t readKey){
            __readData = readData;
            __readSize = __SIZE(__readData);
            __readKey = readKey;
        }
        void MultiSerial::write_data(uint8_t* writeData,uint8_t writeKey){
            __writeData = writeData;
            __writeSize = __SIZE(__writeData);
            __writeKey = writeKey;
        }
        void MultiSerial::TX(void){
            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[0] = __writeKey;
                for(int k = 1;k <= __writeSize;k++){
                    txData[k] = __writeData[k-1];
                }
                
                for(i = 1, tx_checkcode = 0; i<__writeSize+1; i++){
                    tx_checkcode ^= txData[i];
                }
                
                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;
            
            __counter_rx++;
            rxData[rx] = __serial__.getc();
            if(rxData[0] == __readKey){
                rx++;
            }
            if(rx == __readSize+1){
                for(i = 1, rx_checkcode = 0; i < __readSize+1; i++){
                    rx_checkcode ^= rxData[i];
                }
            }
            if(rx >= __readSize+2){
                if(rxData[__readSize+1] == rx_checkcode){
                        
                    __check_rx = 1;    
                        
                    for(int m = 1;m <= __readSize;m++){
                        __readData[m-1] = rxData[m];
                    }
                    
                }else{
                    __check_rx = 0;            
                    }
                rx = 0;
            }
        }
        
        uint8_t MultiSerial::readable_check(){
            
            return __serial__.readable();
            }
            
        void MultiSerial::check_rx_wait(){ 
                
            if(__check_rx==0) NVIC_SystemReset();
            }
        uint8_t MultiSerial::re_counter_rx(){
            
            return __counter_rx;
            
            }
        void MultiSerial::reset_counter_rx(){
            
            __counter_rx = 0;
            
            }