noka @willow-micro / SerialConnect

Dependencies:   AsyncSerial

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SerialConnect.cpp Source File

SerialConnect.cpp

Go to the documentation of this file.
00001 // -*- coding:utf-8-unix -*-
00002 /*!
00003   @file   SerialConnect.cpp
00004   @author Takuma Kawamura <bitpositive@MacBook-Pro-13.local>
00005   @date   Wed Jan 23 13:40:32 2019
00006   
00007   @brief  Nerve-SerialConnect
00008 
00009   MbedのUARTポートを使って,uint8_t(unsigned char)型の配列を送受信するためのライブラリ.割り込み処理を使うため効率的.チェックサムやバイト間タイムアウトを搭載しているので安全かつ,完全な状態で通信を行うことができる.
00010 
00011   @version    1.0
00012 
00013   @see      Mbed OS 2のリビジョンは,必ずRev.146以下にすること.
00014 
00015   @copyright  T.Kawamura (C) 2019 <contact@bit-plus.work>
00016   
00017 */
00018 
00019 #include "SerialConnect.hpp"
00020 
00021 
00022 SerialConnect::SerialConnect( PinName txpin, PinName rxpin, uint32_t payload_size, uint32_t baudrate, uint32_t uart_fifo_buffer_size )
00023     : payload_size( payload_size ), load_status( STATE_WAIT_HEADER ), payload_data_count( 0 )
00024 {
00025   serial_port = new AsyncSerial( txpin, rxpin, baudrate, uart_fifo_buffer_size );
00026     
00027     time_out_timer = new Timer;
00028     time_out_timer->stop();
00029     time_out_timer->reset();
00030     
00031     memset( recieved_payload, 0, NSC_MAX_PACKET_SIZE );
00032 }
00033 
00034 SerialConnect::~SerialConnect( void )
00035 {   
00036     delete serial_port;
00037   delete time_out_timer;
00038 }
00039 
00040 void SerialConnect::send( const uint8_t *payload_array )
00041 {
00042     uint8_t checksum = 0;
00043     
00044     send_buffer[0] = NSC_HEADER;
00045     send_buffer[1] = payload_size;
00046     for( int i = 0; i < payload_size; i++ ) {
00047         send_buffer[i + 2] = payload_array[i];
00048         checksum += payload_array[i];
00049     }
00050     send_buffer[payload_size + 2] = checksum;
00051     send_buffer[payload_size + 3] = NSC_FOOTER;
00052     
00053     serial_port->write( send_buffer, payload_size + 4 );
00054     
00055     return;
00056 }
00057 
00058 update_result_e SerialConnect::update( void )
00059 {
00060     uint8_t data;
00061     uint32_t i;
00062     uint8_t checksum = 0;
00063     
00064     if( serial_port->readable() > 0 ) {
00065         
00066         if( time_out_timer->read_ms() > NSC_TIMEOUT && load_status != STATE_WAIT_HEADER ){
00067             load_status = STATE_WAIT_HEADER;
00068         }
00069         time_out_timer->stop();
00070         time_out_timer->reset();
00071         
00072         data = serial_port->getc(); // 1byte取得
00073         
00074         switch( load_status ) {
00075         case STATE_WAIT_HEADER:
00076             if( data == NSC_HEADER ) {  // '@'
00077                 load_status = STATE_WAIT_LENGTH;    
00078             }
00079             break;
00080             
00081         case STATE_WAIT_LENGTH:
00082             if( data == payload_size ) {
00083                 load_status = STATE_WAIT_PAYLOAD;
00084             } else {
00085                 load_status = STATE_WAIT_HEADER;
00086             }
00087             break;
00088 
00089         case STATE_WAIT_PAYLOAD:
00090             if( payload_data_count < payload_size - 1 ) {
00091                 recv_buffer[payload_data_count] = data;
00092                 payload_data_count++;
00093             } else {
00094                 recv_buffer[payload_data_count] = data;
00095                 payload_data_count = 0;
00096                 load_status = STATE_WAIT_CHECKSUM;
00097             }
00098             break;
00099 
00100         case STATE_WAIT_CHECKSUM:
00101             for( i = 0; i < payload_size; i++ ) {
00102                 checksum += recv_buffer[i];
00103             }
00104                 
00105             if( data == checksum ) {
00106                 load_status = STATE_WAIT_FOOTER;
00107             } else {
00108                 load_status = STATE_WAIT_HEADER;
00109             }
00110             break;
00111             
00112         case STATE_WAIT_FOOTER:
00113             if( data == NSC_FOOTER ) {      // LF
00114                 for( i = 0; i < payload_size; i++ ) {
00115                     recieved_payload[i] = recv_buffer[i];
00116                 }
00117                 load_status = STATE_WAIT_HEADER;
00118                 
00119                 return READY;
00120             } else {
00121                 load_status = STATE_WAIT_HEADER;
00122             }
00123             
00124             break;
00125         }
00126     }
00127     
00128     time_out_timer->start();
00129     
00130     return NOT_READY;
00131 }