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.
SerialConnect.cpp
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 }
Generated on Wed Jul 13 2022 01:06:17 by
1.7.2