関連:
シリアル通信関連記事一覧前回データの受信内容が判明したので、マイコン用の受信プログラムを作成します。
とりあえずsh7125用にて動作確認します。
機材は
XBee S1による無線化3を使用することを前提とします。
受信処理の流れ
基本受信処理1.0xFEを受信したら受信開始(受信数カウントを1にセット)
※以降は受信毎に受信数カウントを1増加
2.受信数カウント2で受信予定数の上位1byteを更新
3.受信数カウント3で受信予定数の下位1byteを更新
4.受信カウント数=受信予定数+4で受信終了
5.最後の受信データでSUMチェック
※SUMチェックを通った場合は解析処理
解析処理1.受信種別が0x83以外の場合は解析中断
2.DI設定のポート数を確認
3.DI設定のポートが1つ以上ある場合はDI情報を取得
4.AD設定のポート数を確認
5.AD設定のポートが1つ以上ある場合はAD情報を取得
プログラム
処理内容の詳細は更新済みのシリアル通信設定(
intSCI.c、
intSCI.h)を参照してください。
主な変更点はAPI受信処理の各種関数作成と受信割込み内でのAPI基本処理を実行です。
今までintSCIにて使用した関数はそのまま利用できます。(たぶん)
使い方(intSCIとintCMT、intMTUを組み合わせた例)
いつも通り、
必要なファイルをプロジェクトへ組み込んでください。
<設定>#include "iodefine.h"
#include "io_setup.h"
#include "intCMT.h"
#include "intSCI.h"
#include "intMTU.h"
void main(
void)
{
unsigned long timer;
char trans_buf[255];
int recive_status;
hardware_setup();
init_SCI0();
init_SCI1();
init_CMT0(1);
init_MTU();
timer=getsystime()+50;
while(1){
if(timer<getsystime()){
timer=getsystime()+50;
//apiの受信状態を取得 recive_status=
check_api_receved();
if(recive_status==1){
//正常受信時 set_pwm2(PWM_PE0,PWM_PE1,(
get_api_ad(0)-512)*2);
sprintf(trans_buf,"%04d,%04d,%04d,%04d\n"
,
get_api_ad(0) ,
get_api_ad(1) ,
get_api_ad(2) ,
get_api_ad(3) );
write_sci1(trans_buf);
}
else if(recive_status>1){
//タイムアウト(500ms)時 set_pwm2(PWM_PE0,PWM_PE1,0);
}
//end recive_status }
//end timer }
//end while}
//end mainXBeeのAD変換値に応じてLED赤(PE0)、LED緑(PE1)の調光を行います。
rx220向けのシリアル通信設定:
intSCI_rx220.c、
intSCI_rx220.hについても同様の更新を
行ったので、同様の処理方法で同じことが行えます。
※使用ポートPC2(SCI5 Rx)、PC3(SCI5 Tx)