noka @willow-micro / SerialConnect

Dependencies:   AsyncSerial

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SerialConnect.hpp Source File

SerialConnect.hpp

Go to the documentation of this file.
00001 // -*- coding:utf-8-unix -*-
00002 /*!
00003   @file   SerialConnect.hpp
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   @see     このソースコードのコメントにはDoxygen方式を使っています.Doxygenを使ってコンパイルすることで,html形式のAPIドキュメントを生成できます.
00016 
00017   @copyright  T.Kawamura (C) 2019 <contact@bit-plus.work>
00018   
00019 */
00020 
00021 #ifndef NSC_SENDRECV_H
00022 #define NSC_SENDRECV_H
00023 
00024 // Includes ////////////////////////////////////////////////////////////////////
00025 #include "mbed.h"   // mbed OS 2.0 Rev 146
00026 #include <cstring>
00027 // mbed のサイトからAsyncSerialをインポートすること
00028 #include "AsyncSerial.hpp"
00029 
00030 using namespace std;
00031 
00032 // Definitions ////////////////////////////////////////////////////////////////
00033 #define NSC_HEADER 0x40
00034 #define NSC_FOOTER 0x0A
00035 #define NSC_TIMEOUT 1000
00036 
00037 #ifndef NSC_MAX_PACKET_SIZE
00038 #define NSC_MAX_PACKET_SIZE 128
00039 #endif
00040 
00041 // 受信状態
00042 enum loadstate_e{
00043   STATE_WAIT_HEADER,
00044   STATE_WAIT_LENGTH,
00045   STATE_WAIT_PAYLOAD,
00046   STATE_WAIT_CHECKSUM,
00047   STATE_WAIT_FOOTER
00048 };
00049 // 受信結果取得用
00050 enum update_result_e{
00051   NOT_READY,
00052   READY
00053 };
00054 
00055 // Class //////////////////////////////////////////////////////////////////////
00056 /*!
00057     @class  SerialConnect
00058     @brief  NSC形式パケットの送受信
00059 */
00060 class SerialConnect {
00061 private:
00062     
00063     // シリアルポート
00064     AsyncSerial *serial_port;
00065   // バイト間タイムアウト用タイマ
00066     Timer *time_out_timer;
00067     // 送信パケットのバッファ
00068     uint8_t send_buffer[NSC_MAX_PACKET_SIZE];
00069     // ペイロードの大きさ(Byte)
00070     int payload_size;
00071     // 状態遷移用
00072   loadstate_e load_status;
00073     // パケットの受信処理で使用するバッファ
00074   uint8_t recv_buffer[NSC_MAX_PACKET_SIZE];
00075     // ペイロードの受信完了データの大きさ
00076   uint8_t payload_data_count;
00077     // ペイロードの格納場所
00078   uint8_t recieved_payload[NSC_MAX_PACKET_SIZE];
00079 
00080 
00081 public:
00082     /*! 
00083         @brief  コンストラクタ
00084     片方向通信でTx, Rxのどちらかのピンを使わない場合は,ピン番号を"NC"とすること.
00085         
00086         @param  txpin                                   パケットを送信するピン(PinNames.hで定義されたもの)
00087     @param  rxpin                                   パケットを受信するピン(PinNames.hで定義されたもの)
00088     @param  payload_size                  やりとりするパケットのペイロードの大きさ(Byte)
00089         @param  baudrate                            ボーレート(省略可,デフォルトは115200bps)
00090         @param  uart_fifo_buffer_size   UARTのリングバッファのサイズ(省略可,デフォルトは256Byte)
00091     */
00092     SerialConnect(PinName txpin, PinName rxpin, uint32_t payload_size, uint32_t baudrate=115200, uint32_t uart_fifo_buffer_size=256);
00093 
00094     /*! 
00095         @brief  デストラクタ
00096     */
00097     virtual ~SerialConnect( void );
00098 
00099     /*! 
00100         @brief  パケットの送信
00101         
00102         @param  uint8_t* payload_array  送信したい配列のポインタ
00103     */
00104     virtual void send( const uint8_t *payload_array );
00105 
00106     /*! 
00107         @brief  パケット受信処理を行う
00108         
00109         メインループ内で毎回必ずこのメソッドを呼び、返り値を見てOKならペイロードの格納が完了しています。
00110     
00111         @retval update_result_e READY           ペイロードの正常な受信および格納が完了
00112         @retval update_result_e NOT_READY   ペイロードの受信処理が続行中
00113     */
00114   virtual update_result_e update( void );
00115     
00116     /*! 
00117         @brief  ペイロードのGetter
00118         
00119         格納済みのペイロードを読み出します。
00120         配列の要素取得と同じように、インデックスを引数として渡します。
00121     
00122         注意: 必ずupdateメソッドでペイロードの受信完了を確認し,その後実行してください
00123         
00124         @param  index   要素のインデックス
00125         
00126         @return uint8_t 要素
00127     */
00128   virtual uint8_t get_payload_by_1byte( uint8_t index ) { return recieved_payload[index]; }
00129     
00130 };
00131 
00132 
00133 #endif  // NSC_SENDRECV_H