TrueSTUDIO 用 LD_Mail_BP359x の説明
V003
2014/09/16
CPU 基板から Mail 送信を行う STM32L-Discovery 用のプロジェクトサンプルです。RAM の使用量は 9Kbyte ぐらいです。
ROHM 社製 WIFi モジュール BP3591 を使用して、WiFi ブロードバンドルータに接続して Mail 送信を行います。
(BP3595, BP3599 でも動作します。)
nifty と yahoo のメールサーバで Mail 送信を確認してあります。
コミュニケーションモードで動作します。Mail 送信には socket 4 を使用しています。
WiFi 接続と Mail 送信のためのパラメータは #define で定義しています。プログラムに埋め込みになります。
試用版の開発ツール Atollic TrueSTUDIO for ARM Lite で作成したプロジェクトです。
プログラムの開始番地は 0x08000000 です。デバッグが可能です。
1
目次
1. STM32L-Discovery と WiFi モジュール BP359x との接続......................................................................................................................................................3
1.1. ROHM 株式会社製の WiFi モジュール BP359x と接続用基板 BP359D とのセットの場合.......................................................................3
1.2. 東亜無線株式会社製 TMD3591AD との接続....................................................................................................................................................................4
2. CPU 基板から Mail 送信するための Network 構成........................................................................................................................................................................5
3. プログラム実行時の動作と動作確認.....................................................................................................................................................................................................6
3.1. プログラム実行時の動作.................................................................................................................................................................................................................6
3.2. Mail 送信の様子....................................................................................................................................................................................................................................6
3.3. DHCP について ......................................................................................................................................................................................................................................7
3.4. smtp 認証について .............................................................................................................................................................................................................................7
3.5. Mail 送信方法.........................................................................................................................................................................................................................................7
3.6. WiFi 接続と Mail 送信のためのパラメータ設定 ....................................................................................................................................................................7
4. プロジェクトの構成............................................................................................................................................................................................................................................8
4.1. 追加したソース・フォルダとファイル...........................................................................................................................................................................................8
5. 主なモジュールの説明..............................................................................................................................................................................................................................10
5.1. ソース・フォルダ src 内のファイル...........................................................................................................................................................................................10
5.2. HandleTIM.c...........................................................................................................................................................................................................................................11
5.3. UserPrograms.....................................................................................................................................................................................................................................12
6. Network パラメータの設定 ......................................................................................................................................................................................................................14
6.1. WiFi ルータの設定 (NetworkParam.h) .................................................................................................................................................................................14
6.2. TCP/IP の Port 番号の設定 (NetworkParam.h) .............................................................................................................................................................14
6.3. TCP/IP のアドレスの設定 (NetworkParam.c)..................................................................................................................................................................15
6.4. Mail 送信パラメータ設定 (NetworkParam.h).....................................................................................................................................................................16
7. Mail_BP3591 のプログラムの構造........................................................................................................................................................................................................18
7.1. 処理番号を使用したプログラムのフロー ..............................................................................................................................................................................18
7.2. 処理番号を使用したプログラムの形......................................................................................................................................................................................19
8. Network 処理モジュールの概要..........................................................................................................................................................................................................20
8.1.ソースフォルダ Network の下のファイル..............................................................................................................................................................................20
8.2. フォルダ BP359x..............................................................................................................................................................................................................................21
9. Mail 送信プログラムのおおまかなフロー...........................................................................................................................................................................................27
9.1. 全体..........................................................................................................................................................................................................................................................27
9.2. Network 処理 : TransactNetwork();.................................................................................................................................................................................27
9.3. Network Access : NetworkAccessBP359x();.............................................................................................................................................................28
10. Mail 送信処理モジュールの説明 ......................................................................................................................................................................................................29
2
1. STM32L-Discovery と WiFi モジュール BP359x との接続
WiFi モジュール BP359x をアクセスするために UART(非同期シリアル通信)を使用します。
1.1. ROHM 株式会社製の WiFi モジュール BP359x と接続用基板 BP359D とのセットの場合
表1.1. BP359D と STM32L-Discovery との接続信号
CN1
番号
1
2
3
4
5
6
7
8
9
BP359D の信号名
GND
GPIO0
GPIO1
VCC
VCC
BOOT_SEL1
BOOT_SEL0
FLASH_SEL
GND
CPU 信号名
-------------------------------------
CPU 機能名
-------------
CN2
番号
1
2
3
4
5
6
7
8
9
BP359D の信号名
GND
SDDATA1
SDDATA0
UART_RxD
UART_TxD
GPIO6
PRST
GPIO2
GND
CPU 信号名
------------PC10
PC11
----PC12
---------
備考
-----------------
コネクタピン番号
-------------------------------------
CPU 機能名
------------USART3_TX
USART3_RX
----I/O
---------
コネクタピン番号
------------P2-15
P2-14
----P2-13
---------
備考
BOOT_SEL_1 を抵抗 10k でプルアップするための接続は次のようにします。
BOOT_SEL_1
抵抗 10k
VCC
Status_LED の接続は次のようにします。
GPIO2
抵抗 3.3k
GND
3
+3.3V
+3.3V
10k の抵抗でプルアップ
Network_Reset
Status_LED
1.2. 東亜無線株式会社製 TMD3591AD との接続
表1.2. TMD3591AD と STM32L-Discovery との接続信号
番号 TMD3591AD の信号名 CPU 信号名 CPU 機能名
1
VCC
--------2
VCC
--------3
PRST
PC12
I/O
4
GPIO0
--------5
GPIO1
--------6
GPIO2
--------7
GPIO6
--------8
M_ANA
--------9
FLASH_SEL
--------10
BOOT_SEL_0
--------11
UART_RXD
PC10
USART3_TX
12
UART_TXD
PC11
USART3_RX
13
SDATA1
--------14
SDATA0
--------15
GND
--------16
GND
---------
4
コネクタピン番号
--------P2-13
----------------------------P2-15
P2-14
-----------------
備考
+3.3V
+3.3V
Network_Reset
Status_LED
2. CPU 基板から Mail 送信するための Network 構成
ルータと CPU 基板の接続は次のようになります。
Web
ルータ
WiFi モジュール
BP3591
UART
CPU 基板
5
3. プログラム実行時の動作と動作確認
3.1. プログラム実行時の動作
1) プログラムを実行すると基板上の Status LED LD3(緑)が 1 秒点灯、2 秒消灯 で点滅します。
2) プログラムの動作が開始してから、BP3591 と WiFi ルータの接続が確立するのに、約 20 秒程度かかります。
BP3591 の GPIO2 に Status LED を接続している場合、接続確立中は1秒間隔で点滅します。接続が確立すると点灯した
ままになります。
ただし、コンフィグレーションが行われなかった場合など、最初から点灯したままなので注意が必要です。
20 秒近く点滅した後、点灯したらルータとの接続が確立したと判断するとよいと思います。
3.2. Mail 送信の様子
基板上の User スイッチを一回押すと一回 Mail 送信を行います。通常、10 秒以内に送信処理が終了します。
回線の状態によっては、数分かかることもあります。
User スイッチは一回押したら、十秒以上待ってから次を押してください。続けざまに Mail 送信するのはよくありません。
なお、プログラムをデバッグするときやプログラム作成において スパムメールにならないように細心の注意を払うように
してください。
User スイッチを押したとき、Mail 送信を開始して LD3(緑)が点灯します。Mail 送信が終了すると LD3(緑)は消灯します。
1) STM32l-Discovery の User スイッチを何回か押して nifty の Mail ソフトで受信した様子を以下に示します。
a) 差出人は “I’m STM32L152RB.” です。
b) Mail の題名は “a Mail from STM32L No.x” です。 xの部分は User スイッチを押すごとに +1 されます。
c) Mail の本文は “a Test Mail from STM32L-Discovery No.x” です。xの部分は上記と同様です。
6
3.3. DHCP について
本プロジェクトサンプルでは、動作開始時に DHCP 処理を使用してルータに IP アドレスを自動割り当てしてもらいます。
3.4. smtp 認証について
本プロジェクトサンプルでは EHLO コマンド(Extended Hello : smtp サービス拡張機能を使用開始する)を SMTP サーバに
送信して通信を開始し、smtp 認証を行った後、メール送信を行います。
smtp 認証には PLAIN を使用します。ユーザーIDとパスワードを BASE64 エンコードと呼ばれるコードに変換して、
SMTP サーバに送信して認証を行います。
セキュリティ的にはだいぶ弱いですが、CPU が STM32L152 なので簡単なものを採用しました。
3.5. Mail 送信方法
本プロジェクトサンプルの main.c の例のように main()関数の無限ループの中で
//--------------------------------------// Network処理
//--------------------------------------TransactNetwork(&uint8_JobNum);
が呼び出されている場合、他のモジュールから以下のような操作をすることにより、Mail 送信を行うことができます。
a) Mail 題名をセットする。
以下の Buffer GLB_uint8_MailSubject に題名をセットします。
uint8_t GLB_uint8_MailSubject[defSizeMailSubject]; // Mail題名
b) Mail本文をセットする。
以下の Buffer GLB_uint8_MailBody に本文をセットします。
uint8_t GLB_uint8_MailBody[defSizeMailBody + defSizeMailDate];
// Mail本文
c) Mail 送信フラグを ON にする。
以下のフラグ GLB_int16_vSendMailNetwork を 1 にすると Mail 送信を行います。
// Mail送信要求フラグ : 1 = Mail送信開始 : Mail送信正常終了時 0 になる。Error終了の場合 -1 になる。
volatile int16_t GLB_int16_vSendMailNetwork = 0;
3.6. WiFi 接続と Mail 送信のためのパラメータ設定
「 6. Network パラメータの設定 」 の項をご覧ください。
7
Mail 送信の方法は、main.c だけを見れば分かります。
以下の内容は、プログラムの中身に興味のある方はご覧ください。
4. プロジェクトの構成
TrueSTUDIO で作成したプロジェクト LD_Mail_BP359x を開いた状態を以下に示します。
左側のプロジェクト・エクスプローラーの LD_Mail_BP359x を展開した状態です。
4.1. 追加したソース・フォルダとファイル
追加したソース・フォルダとファイルについて簡単に説明します。
1) CommonModules (ソース・フォルダ)
共通に使用するモジュールを記述してあります。
時間待ち、文字列操作 などの処理を記述しています。
2) Handles(ソース・フォルダ)
Peripheral の設定などを行っています。
a) HandleGPIO.h HandleGPIO.c (ファイル)
GPIO 入出力の初期設定を記述しています。
b) HandleTIM.h HandleTIM.c (ファイル)
タイマ割り込みを使用するために、タイマの初期設定を記述しています。
1mSec ごとにタイマ割り込みが発生するように設定しています。
c) HandleUART.h HandleUART.c (ファイル)
UART の初期化処理を記述しています。
8
3) Network(ソース・フォルダ)
Mail 送信の処理を記述しています。
a) Network.h Network.c (ファイル)
Mail 送信処理の一番上位のモジュールです。BP3591 のコンフィグレーション を行った後、User スイッチが押された
ときにMail送信を行います。
b) NetParam.h NetParam.c (ファイル)
WiFi ルータに接続するためのパラメータを設定します。
c) NetUtilities.h NetUtilities.c (ファイル)
文字列の IP アドレスを 32bit のデータに変換する処理や、32bit データを文字列の IP アドレスに変換するなど、
Network 処理に使用する共通処理を記述しています。
4) BP359x : フォルダ Network の下にフォルダ BP359x があります。
a) HandleBP359x.h HandleBP359x.c(ファイル)
BP3591 のコミュニケーションモードを使用するための WID の書き込み、読み込みを行います。
b) Communicate_BP359x.h Communicate_BP359x.c(ファイル)
UART により BP3591 と送受信する処理を行います。USART3 を使用します。
c) ConfigBP359x.h ConfigBP359x.c(ファイル)
BP3591 をコンフィグレーションします。
d) SendMail_BP359x.h SendMail_BP359x.c(ファイル)
Mail 送信を行います。
e) AccessBP359x.h AccessBP359x.c(ファイル)
受信データからフレームデータを取り出し、種類により処理します。
Mail 送信の処理を行います。
5) UserPrograms (ソース・フォルダ)
LED のための処理を記述しています。
a) UserPrograms.h UserPrograms.c (ファイル)
Status LED : LD3(緑) に使用している GPIO の初期設定と点滅処理を記述しています。
LD4(青)に使用している GPIO の初期設定を記述しています。
9
5. 主なモジュールの説明
5.1. ソース・フォルダ src 内のファイル
ソース・フォルダ src 内のファイルでプログラムを追加した主なファイルについて簡単に説明します。
1) main.c
a) main 関数
プログラムはここから開始します。主に初期化処理関数を呼び出しています。
int main(void)
b) 使用する周辺クロックの初期化
void RCC_Configuration(void);
c) GPIO の初期化
void Init_GPIOs(void);
d) システムクロック SYSCLK の設定
内部クロック HIS を使用して、システムクロック SYSCLK を 32MHz に設定します。
//---------------------------------------------------------------------------------// HSIを選択して、PLL ClockをSystem Clockとして使用する。 : SYSCLK = 32MHz
//---------------------------------------------------------------------------------void SetHSICLK(void);
e) Mail 送信試験
User スイッチが押されるごとに、Mail 送信を一回行います。Mail 送信が終了するまで、次の User スイッチ入力を
受け付けません。
//--------------------------------------// Mail送信試験
//--------------------------------------int16_t Test_SendMail(void);
2) stm32f4xx_it.h stm32f4xx_it.c
この File に割り込み処理を記述します。
本プロジェクトサンプルでは TIM6 のタイマ割り込み処理と USART3 の割り込み処理を記述しています。
10
5.2. HandleTIM.c
1) TIM6 の初期化
タイマ割り込みのために TIM6 を初期化してインターバルをセットします。
1mSec ごとに割り込みがかかるように設定しています。
以下の関数の引数に TIM6 用のパラメータを指定して TIM6 を初期化します。
//-----------------------------------------------------------------------------// TIMx初期化
//-----------------------------------------------------------------------------//引数 :
// TIM_TypeDef *TIMx : TIM選択 : TIM6 or TIM7
// uint32_t RCC_APB1Periph_TIMx : specifies the APB1 peripheral to gates its clock.
// uint16_t uint16_Interval : TiMxのインターバル設定値
//-----------------------------------------------------------------------------void InitializeTIMx(TIM_TypeDef *TIMx, uint32_t RCC_APB1Periph_TIMx, uint16_t uint16_Interval);
2) タイマ割り込み許可
以下の関数の引数に希望する TIM6 用のパラメータを指定して割り込みを許可します。
//----------------------------------------------------------------------------------// TIMx割り込み許可
//----------------------------------------------------------------------------------//引数 :
// uint32_t RCC_APB1Periph_TIMx : specifies the APB1 peripheral to gates its clock.
// uint8_t TIMx_IRQn : STM32 specific Interrupt Numbers
//----------------------------------------------------------------------------------void EnableIrqTIMx(uint32_t RCC_APB1Periph_TIMx, uint8_t TIMx_IRQn);
11
5.3. UserPrograms
UserPrograms.h には LED に使用する GPIO に対する定義を記述してあります。
以下に、UaerPrograms.c に記述している関数の説明を記します。
1) LED に使用する GPIO の初期化(共通処理)
GPIO番号とピン番号を指定して I/Oを初期化します。
//---------------------------------------------------------------// LEDポート初期化
//---------------------------------------------------------------//引数 :
// GPIO_TypeDef *GPIOx : GPIOポート指定
// uint16_t GPIO_Pin_x : GPIOピン指定
//---------------------------------------------------------------void InitializePortLED(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin_x);
2) LED の点滅処理(共通処理)
GPIO番号とピン番号などを指定して 希望のLEDの点滅処理を行います。
//---------------------------------------------------------------// LED点滅 : 点灯/消灯 切り替え
//---------------------------------------------------------------// 点灯/消灯 を切り替えると同時に 点灯時間/消灯時間 をセットする。
//---------------------------------------------------------------//引数 :
// GPIO_TypeDef *GPIOx : GPIOポート指定
// uint16_t GPIO_Pin_x : GPIOピン指定
// int16_t *pint16_OnOff : ON/OFF状態
//
0 : OFF
//
1 : ON
// uint16_t *puint16_Timer : 点灯時間/消灯時間をセットする変数のポインタ
// uint16_t uint16_TimeON : 点灯時間
// uint16_t uint16_TimeOFF : 消灯時間
//---------------------------------------------------------------void BlinkLED(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin_x,
int16_t *pint16_OnOff, uint16_t *puint16_Timer,
uint16_t uint16_TimeON, uint16_t uint16_TimeOFF);
12
3) LED に使用する I/O の初期化
a) Status LED : LD3(緑)初期化
//---------------------------------------------------------------// Status LEDポート初期化 : LD3(緑)
//---------------------------------------------------------------void InitializePortStatusLED(void);
b) LD4(青)初期化
//---------------------------------------------------------------// LD4(青) ポート初期化
//---------------------------------------------------------------void InitializePortLD4(void);
4) LED の点滅
a) StatusLED : LD3(緑)点滅
//---------------------------------------------------------------// Status LED点滅 : LD3(緑) : 点灯/消灯 切り替え
//---------------------------------------------------------------// TIMx割り込み内でGLB_uint16_BlinkTimerStatusLEDをデクリメントする。
// GLB_uint16_BlinkTimerStatusLEDが0になった時、呼び出される。
//---------------------------------------------------------------// 点灯/消灯 を切り替えると同時に 点灯時間/消灯時間 をセットする。
//---------------------------------------------------------------//引数 :
// uint16_t uint16_TimeON : 点灯時間
// uint16_t uint16_TimeOFF : 消灯時間
//---------------------------------------------------------------void BlinkStatusLED(uint16_t uint16_TimeON, uint16_t uint16_TimeOFF);
13
6. Network パラメータの設定
本プログラムサンプルでは WiFi ルータの SSID やアクセスのための IP アドレスなどをプログラム埋め込みにしているため、
使用環境に応じて、設定部分を変更する必要があります。
6.1. WiFi ルータの設定 (NetworkParam.h)
NetworkParam.h内の下記の部分を使用するWiFiルータに合わせて書き換えてください。
項目は上から、SSID, SecurityKey, PinCode の3項目です。
//-----------------------------------------------------// WiFiルータの設定
//-----------------------------------------------------// 実際の環境に合わせて書き換えてください。
//-----------------------------------------------------#define defSSID "URoadWPS-35F14B"
#define defSecurityKEY "01234567"
#define defPinCode "76543210"
//------------------------------------------------------
6.2. TCP/IP の Port 番号の設定 (NetworkParam.h)
defPortMail が Mail 送信処理用の Port 番号です。問題なければそのまま使用してください。
//-----------------------------------------------------//Port番号
//-----------------------------------------------------// 実際の環境に合わせて書き換えてください。
//-----------------------------------------------------#define defTCP_ServerPort 10000
#define defHTTP_ServerPort 10001
#define defPortQueryIP 10002
#define defPortMail 10003
//------------------------------------------------------
14
6.3. TCP/IP のアドレスの設定 (NetworkParam.c)
ConfigBP359x.h において、以下に示す#define defDHCP を定義している場合は DHCP が有効になり、ルータが
IP アドレスを割り当ててくれます。
//------------------------------------------------------// DHCPを有効にする場合は定義する。
//------------------------------------------------------// ルータに固定のIP Addressを設定して使用する場合はコメントアウトする。
//------------------------------------------------------#define defDHCP
//-------------------------------------------------------
上記の定義をしないで DHCP を無効にして自分でルータに IP アドレスを設定する場合は、
NetworkParam.c 内の下記の部分の TCP/IP にアクセスするためのアドレスを設定したアドレスに変更してください。
上から、IP アドレス、 Mask アドレス、 Gateway アドレス です。
//---------------------------------------------------------------------// IP Addressの設定
//---------------------------------------------------------------------// 実際の環境に合わせて書き換えてください。
//---------------------------------------------------------------------uint8_t GLB_uchrIP[4] = {192, 168, 100, 109};
// Source IP Address
uint8_t GLB_uchrMaskIP[4] = {0xFF, 0xFF, 0xFF, 0x00};
// IP Address Mask
uint8_t GLB_uchrGatewayIP[4] = {192, 168, 100, 254};
// Gateway IP Address
//----------------------------------------------------------------------
15
6.4. Mail 送信パラメータ設定 (NetworkParam.h)
Mail 送信するためのパラメータを設定します。
下記のそれぞれのパラメータは実際に登録した内容に合わせて書き換えてください。
1) Mail Server の URL は契約しているプロバイダの URL に変更してください。
例えば nifty の場合は、smtp.nifty.com に、YAHOO の場合は smtp.mail.yahoo.co.jp になります。
2) Mail 宛先の URL は送信したい URL に変更してください。
例 : [email protected]
[email protected]
3) 差出人の URL は契約している自分のメールアドレスです。
4) UserID と Pasword は契約しているメールのものです。
5) 差出人名はメールに表示されます。
//-----------------------------------------------------// Mail送信パラメータ
//-----------------------------------------------------// 実際の環境に合わせて書き換えてください。
//-----------------------------------------------------//---------------------------------------------------// Mail Server Port
//---------------------------------------------------// 使用しているメールサーバーに合わせて25または587を指定してください。
//---------------------------------------------------// smtp認証を行うようになってから 587 を使用するようです。
//---------------------------------------------------//#define defPortSendMail 25
//---------------------------------------------------#define defPortSendMail 587
//----------------------------------------------------
//---------------------------------------------------// Mail Server URL
//---------------------------------------------------// 例 : 以下のようなメールサーバがあります。
// smtp.nifty.com : niftyのMailサーバ
// smtp.mail.yahoo.co.jp : YAHOOのMailサーバ
//---------------------------------------------------#define defMailServerURL "smtp.nifty.com"
//#define defMailServerURL "smtp.mail.yahoo.co.jp"
//----------------------------------------------------
16
//-----------------------------------------------------// 差出人のURL
//-----------------------------------------------------// 自分が契約しているメールアドレスを指定してください。
//-----------------------------------------------------// 例 :
// [email protected]
// nifty
// [email protected]
// YAHOO
//-----------------------------------------------------#define defMailSenderURL "[email protected]"
//#define defMailSenderURL "[email protected]"
//------------------------------------------------------
//-----------------------------------------------------// 契約しているUaerIDとPaswordを指定してください。
//-----------------------------------------------------//-----------------------------------------------------// UserID : 自分のメールアドレスの@の前の部分です。
//-----------------------------------------------------// 例 :
// [email protected]
// nifty
// [email protected]
// YAHOO
//-----------------------------------------------------#define defMailUserID "UserID"
//-----------------------------------------------------//-----------------------------------------------------// Password
//-----------------------------------------------------#define defMailPassword "Password"
//------------------------------------------------------
//-----------------------------------------------------// 差出人名
#define defMailSenderName "I'm STM32L152RB."
// Mail題名
#define defMailSubject "a Mail from STM32L"
//------------------------------------------------------
//-----------------------------------------------------// Mail宛先のURL
//-----------------------------------------------------// 試験の時は他人に迷惑が掛からないように自分宛に送信してください。
//-----------------------------------------------------#define defMailAddressURL "[email protected]"
//------------------------------------------------------
17
7. Mail_BP3591 のプログラムの構造
Mail_BP3591 のプログラムは処理番号を使用して、順次処理を行う構造をとっています。
7.1. 処理番号を使用したプログラムのフロー
処理番号を使用したプログラムの概念的なフローを以下に示します。
この例ではモジュールが 処理番号0、 処理番号1、 処理番号2 の3個の処理で構成されています。
処理番号0 -> 処理番号1 -> 処理番号2 -> 処理番号0 -> ...と処理番号0 ~ 処理番号2を繰り返します。
また、戻り値は処理中は -1、 最後の処理番号の処理で正常終了時 0、エラーが発生した場合 NG : 1 以上の値を
返します。
開始
処理番号による分岐
処理番号0の処理
処理終了?
YES
処理番号1の処理
NO
処理終了?
YES
処理番号2の処理
NO
処理終了?
YES
処理番号 +1
処理番号 +1
処理番号 = 0
戻り値 = -1
戻り値 = -1
戻り値 = 0
終了
18
NO
7.2. 処理番号を使用したプログラムの形
例えば、処理番号 : uint8_t uint8_JobNum を用いて次のように処理します。
この例では、通信の処理において 受信待ちをしてデータを受信したらデータの処理をして応答のための送信処理を
行っています。送信処理が終了したら受信待ちに戻ります。
//戻り値 :
//
-1 : 処理中
//
0 : OK 終了
//
1 以上 : NG 終了
int16_t 送受信処理()
{
switch(uint8_JobNum){
case 0:
int16_Return = 受信処理();
if(int16_Return == -1){
break;
//処理中
}
if(int16_Return > 0){
int16_Return = 1;
break;
}
//NG 終了
受信データによる処理と送信データ作成();
uint8_JobNum++;
//次の処理番号
int16_Return = -1; //処理中
break;
case 1:
int16_Return = 送信処理();
if(int16_Return == -1){
break;
//処理中
}
uint8_JobNum = 0; //処理番号を 0 に戻す
int16_Return = 0; //OK 終了
break;
}
return(int16_Return);
}
上記の 受信処理(); と 送信処理(); の内部も同じ構造で記述されています。戻り値が -1 の時は処理中で同じ処理番号
の部分をループして、処理が OK 終了だった場合、処理番号を進めて、次の処理を行います。
19
8. Network 処理モジュールの概要
Network 処理のためのモジュールについて概要を説明します。
プロジェクトのソースフォルダ Network のしたに、上位モジュールを記述したファイルと BP3591 をアクセスするための
モジュールが記述されたソースファイル群が格納されているソースフォルダ BP3591 があります。
8.1.ソースフォルダ Network の下のファイル
1) Network
Network 処理の最上位のモジュールです。
Network の初期化を行った後、Network 通信処理をループします。
a) TransactNetwork
//---------------------------------------------------------------// Network処理
//---------------------------------------------------------------// BP359xの初期化を行った後、Network通信処理をLoopする。
//---------------------------------------------------------------//引数 :
// uint8_t *puint8_JobNum : 処理番号のポインタ
//---------------------------------------------------------------int16_t TransactNetwork(uint8_t *pint8_JobNum);
2) NetParam
a) SetNetworkParameter
Network 接続のためのパラメータ、WiFi の SSID, SecurityKEY や IP アドレス のパラメータなどを
設定します。
//------------------------------------------------------------// Networkパラメータ設定
//------------------------------------------------------------//戻り値:
//
0 : OK
//
1以上 : NG
//------------------------------------------------------------int16_t SetNetworkParameter(void);
3) NetUtilities
Network 処理のための共通モジュールを記述してあります。
20
8.2. フォルダ BP359x
1) AccessBP359x
a) NetworkAccessBP359x
BP3591 にアクセスして Network 通信を行います。
//---------------------------------------------------------------------------------------------------// Network通信処理
//---------------------------------------------------------------------------------------------------//引数 :
// uint8_t *puint8_JobNum : 処理番号
// struct sNetworkData *pstructNetworkData : 受信したNetworkデータを格納する構造体のポインタ
//戻り値:
//
-1 : 処理中
//
0 : OK終了
//---------------------------------------------------------------------------------------------------int16_t NetworkAccessBP359x(uint8_t *puint8_JobNum, struct sNetworkData *pstructNetworkData);
21
2) Communicate_BP359x
BP3591 との通信処理を行います。
a) UART_SendBP359x
BP3591 にデータを送信します。
//--------------------------------------------------------------------------------------// BP359x UART送信
//--------------------------------------------------------------------------------------//引数 :
// uint8_t *puint8_JobNum : 処理番号のポインタ
// uint16_t uint16_Length : 送信データ数
// uint8_t *puint8_Data : 送信データのポインタ
//戻り値 :
//
-1 : 処理中
//
0 : OK終了
//--------------------------------------------------------------------------------------int16_t UART_SendBP359x(uint8_t *puint8_JobNum, uint16_t uint16_Length, uint8_t *puint8_Data);
b) UART_ReceiveBP359x
BP3591 からデータを受信します。
//--------------------------------------------------------------------------------------// BP359x UART受信
//--------------------------------------------------------------------------------------//引数 :
// uint8_t *puint8_JobNum : 処理番号のポインタ
// struct sRxData *psutructRxData : 受信データの情報を格納する構造体のポインタ
//戻り値 :
//
-1 : 処理中
//
0 : OK終了
//
1以上 : NG
//--------------------------------------------------------------------------------------int16_t UART_ReceiveBP359x(uint8_t *puint8_JobNum, struct sRxData *pstructRxData);
22
c) CommunicateReceiveBP359x
BP3591 からの受信データからフレームデータを取り出し、種類に見合ったデータを取得します。
//---------------------------------------------------------------------------------------------------// 受信 BP359x : 受信したデータの種類を識別して種類に見合ったデータを取得する。
//---------------------------------------------------------------------------------------------------//引数 :
// uint8_t *puint8_JobNum : 処理番号
// struct sNetworkData *pstructNetworkData : 受信したNetworkデータを格納する構造体のポインタ
//戻り値:
//
-1 : 処理中
//
0 : OK終了
//---------------------------------------------------------------------------------------------------int16_t CommunicateReceiveBP359x(uint8_t *puint8_JobNum, struct sNetworkData *pstructNetworkData);
d) GetReceiveDataAndSetFlag_BP359x
フレームデータから種類に見合ったデータを取得します。
//---------------------------------------------------------------------------------------// Data取得とflagセット : 受信データの種類(WID/DATA)によりフラグをセットして種類に見合ったデータを取得する。
//---------------------------------------------------------------------------------------//引数 :
// struct sNetworkData *pstructNetworkData : 受信したNetworkデータを格納する構造体のポインタ
//戻り値:
//
0 : OK
//
1 : NG and Continue
//
2 : NG and End
//---------------------------------------------------------------------------------------int16_t GetReceiveDataAndSetFlag_BP359x(struct sNetworkData *pstructNetworkData);
23
e) ConnectClientTCP
TCP/IP において Client 接続を行います。
//----------------------------------------------------------------------------------------// TCP Client接続
//----------------------------------------------------------------------------------------//引数 :
// uint8_t *puint8_JobNum : 処理番号のポインタ
// struct sSocket *pstructSocket : パケットの内容をセットする構造体のポインタ
// struct sNetworkExpect *pstructNetworkExpect : 取得するデータを指定する構造体のポインタ
//戻り値 :
//
-1 : 処理中
//
0 : OK終了
//
1以上 : NG終了
//----------------------------------------------------------------------------------------int16_t ConnectClientTCP(uint8_t *puint8_JobNum, struct sSocket *pstructSocket,
struct sNetworkExpect *pstructNetworkExpect);
f) SendReceiveClientTCP
Client 接続した相手と送受信を行います。
//----------------------------------------------------------------------------------------// TCP Client送受信
//----------------------------------------------------------------------------------------//引数 :
// uint8_t *puint8_JobNum : 処理番号のポインタ
// struct sSocket *pstructSocket : パケットの内容をセットする構造体のポインタ
// struct sNetworkExpect *pstructNetworkExpect : 取得するデータの指定および受信データの情報を
格納する構造体のポインタ
//------------------------------------------------------------------------// 受信データ情報はAccessBP359x.c内のモジュール、NetworkAccessBP359xの中で
// struct sNetworkExpect *pstructNetworkExpectにセットされる。
//------------------------------------------------------------------------//戻り値 :
//
-1 : 処理中
//
0 : OK終了
//
1以上 : NG終了
//----------------------------------------------------------------------------------------int16_t SendReceiveClientTCP(uint8_t *puint8_JobNum, struct sSocket *pstructSocket,
struct sNetworkExpect *pstructNetworkExpect);
24
3) ConfigBP359x
a) InitializeBP359x
BP3591 との通信に使用する UART を初期化し、BP3591 をコンフィグレーションします。
//-------------------------------------------------------------------------------------// WiFi BP359x初期化
//-------------------------------------------------------------------------------------//引数 :
// uint8_t *puint8_JobNum : 処理番号のポインタ
// struct sNetworkData *pstructNetworkData : 受信したNetworkデータを格納する構造体のポインタ
// struct sNetworkExpect *pstructNetworkExpect : 取得するデータを指定する構造体のポインタ
//戻り値:
//
-1 : 処理中
//
0 : OK
//
1 : NG
//-------------------------------------------------------------------------------------int16_t InitializeBP359x(uint8_t *puint8_JobNum, struct sNetworkData *pstructNetworkData);
b) EnterCommunicationMode
BP3591 をコミュニケーションモードにします。
//--------------------------------------------------------------------------// コミュニケーションモードに移行
//--------------------------------------------------------------------------//引数 :
// uint8_t *puint8_JobNum : 処理番号のポインタ
//戻り値:
//
-1 : 処理中
//
0 : OK
//
1 : Timeout
//--------------------------------------------------------------------------int16_t EnterCommunicationMode(uint8_t *puint8_JobNum);
25
c) ConfigurationBP539x
BP3591 をコンフィグレーションします。
//-----------------------------------------------------------------------------------// コンフィグレーションBP359x : 接続するWiFiのSSIDやBP359xのIP Address, Port番号などを設定する。
//-----------------------------------------------------------------------------------//引数 :
// uint8_t *puint8_JobNum : 処理番号のポインタ
// struct sNetworkExpect *pstructNetworkExpect : 取得するデータの指定および情報が格納されている
構造体のポインタ
//戻り値 :
//
-1 : 処理中
//
0 : OK
//
1 : NG(初期化失敗)
//-----------------------------------------------------------------------------------int16_t ConfigurationBP359x(uint8_t *puint8_JobNum, struct sNetworkExpect *pstructNetworkExpect);
4) HandleBP359x
BP3591 のコンフィグレーションモードにおいて WID 書き込み、読み込みを行います。
WID 処理をするためのモジュールを全て記述してあります。
この WID 処理のプログラムは結構めんどうくさいので、ライブラリの感覚で使用していただくのがよいと思います。
5) SendMail_BP359x
Mail 送信処理を行います。
Mail 送信フラグが ON になると Mail 送信を一回行います。
26
9. Mail 送信プログラムのおおまかなフロー
9.1. 全体
main モジュール main();の処理です。
開始
CPU 基板初期化
User スイッチが押されたとき、
Mail のデータを作成して、
Mail 送信フラグを ON にする。
Network 処理
Test_SendMail();
TransactNetwork()
(内部で Mail 送信処理);
9.2. Network 処理 : TransactNetwork();
Network 処理の最上位の処理です。
開始
BP3591 初期化
Network Access
NetworkAccessBP3591();
27
9.3. Network Access : NetworkAccessBP359x();
Network にアクセスする最上位の処理です。
BP3591 からデータを受信して、データが Mail 送信用のデータの場合、Mail 送信モジュールに渡します。
「Mail 送信処理」 は自分のデータであるかを判断して、自分のデータであれば処理を行います。
開始
Network Access パラメータ初期設定
BP3591 受信処理
Mail 送信処理
GetReceiveDataBP359x();
SendMail_BP359x();
28
10. Mail 送信処理モジュールの説明
フォルダ Network\BP359x 内の SendMail_BP359x.c にモジュールがあります。
Mail 送信フラグをチェックしてフラグが ON なら Mail 送信を一回行います。
1) Mail 送信モジュール
Mail 送信モジュールのプロトタイプを以下に示します。
//-------------------------------------------------------------------------------------------// Send Mail to Mail server : Mail送信
//-------------------------------------------------------------------------------------------//引数 :
// uint8_t *puint8_JobNum : 処理番号のポインタ
// uint8_t uint8_Socket : Mail送信に使用するSocket番号
// struct sNetworkExpect *pstructNetworkExpect : 取得するデータを指定および受信データ情報を格納する
構造体のポインタ
//------------------------------------------------------------------------// 受信データ情報はAccessBP359x.c内のモジュール、NetworkAccessBP359xの中で
// struct sNetworkExpect *pstructNetworkExpectにセットされる。
//------------------------------------------------------------------------//戻り値 :
//
-1 : 処理中
//
0 : OK終了
//
1 : 動作Error
//-------------------------------------------------------------------------------------------int16_t SendMailNetwork(uint8_t *puint8_JobNum, uint8_t uint8_Socket,
struct sNetworkExpect *pstructNetworkExpect);
2) Mail 送信方法
a) Mail 題名をセットする。
以下の Buffer GLB_uint8_MailSubject に題名をセットします。
uint8_t GLB_uint8_MailSubject[defSizeMailSubject]; // Mail題名
b) Mail本文をセットする。
以下の Buffer GLB_uint8_MailBody に本文をセットします。
uint8_t GLB_uint8_MailBody[defSizeMailBody + defSizeMailDate];
// Mail本文
c) Mail 送信フラグを ON にする。
以下のフラグ GLB_int16_vSendMailNetwork を 1 にすると Mail 送信を行います。
// Mail送信要求フラグ : 1 = Mail送信開始 : Mail送信正常終了時 0 になる。Error終了の場合 -1 になる。
volatile int16_t GLB_int16_vSendMailNetwork = 0;
29
3) Mail 送信処理のフロー
Mail 送信処理のフローを以下に示します。
開始
処理番号0
NO
Mail 送信フラグ ON?
YES
NO
処理番号1
ClientTCP セマフォ OFF?
処理番号2
YES
Mail サーバの IP アドレス取得
処理番号3
TCP Client 接続
処理番号4
接続確認
処理番号5
EHLO コマンドをセット
処理番号6
EHLO コマンド : 通信開始を通知と応答確認
smtp 認証データセット
処理番号7
GetIPfromURL();
ConnectClientTCP();
smtp 認証データ送信と応答確認
MAIL + FROM データセット
処理番号8
MAIL + FROM : 発信元を通知と応答確認
RCPT + TO : 宛先 URL データセット
処理番号9
RCPT + TO : 宛先 URL を通知と応答確認
DATA コマンド : 送信開始データセット
処理番号10
DATA コマンド : 送信開始を通知と応答確認
Mail ヘッダ + 本文 + <CR><LF>をセット
処理番号11
Mail ヘッダ + 本文 + <CR><LF>送信と応答確認
処理番号12
QUIT コマンドをセット
処理番号13
QUIT コマンド : 通信終了を通知と応答確認
処理番号14
TCP Client ソケット Close
処理番号15
ソケットステータスの確認
SetWID_SOC_CONNECT();
終了
30
改訂履歴
V001
2014/08/26
初版
V002
2014/08/27
Network パラメータ(WiFi 接続、Mail 送信)設定の説明追加
V003
2014/09/16
説明追加
31
© Copyright 2026 Paperzz