パソコンと通信してみる

ハイパーターミナル画面

シリアル通信をして、パソコンとデータの通信をする。


通信関数を使ってパソコンからデータを送り、PCからH8-3664を操るという基礎的なところを試してみます。

パソコンと通信

まずは TekRobo工作室 の
パソコンとシリアル通信する を見てください。
通信の種類など基本的な説明があるのでよくわかると思います。

 

GDLにはもともとシリアル通信の関数が用意されています。。この関数群を使うとわりと簡単に通信などが扱えます。せっかくあるのですからコレを使うことにします

でも、この関数は割り込みを使って送信、受信をする関数ですが、主にデバッグ表示用にあるようで複雑なことはできないようです。しかし、コレを使うと複雑な設定をしなくても、お手軽にパソコンとやり取りできるので使ってみます。

GDLフォルダ内 3664Fフォルダにある 3664.txtの説明のファイルを読んでおきましょう。 関数などに関しての説明書きがあります。

 

用意されている通信関数は

  1. ポート初期化、バッファ操作など
  2. 一文字送信、受信
  3. 文字列送信、受信
  4. printfのように使える簡易フォーマット出力

の関数などです。

この関数を使うと、パソコンとのやり取りは手軽にできます。

 

説明のファイルに使用方法、例などがあります。 
SCI3_INIT( ) で初期化 して、EIで割り込み許可すれば、使用可能。

 

この関数と、PCからはハイパーターミナルを使ってH8とやり取りし、
PCから送ったデータでH8のLEDの点滅を操作する ということをやってみます。

 

回路図

 

  conectRS232C

 

3664FとのRS232CはPCとつないでおきます。

あとはLEDだけの回路です。

 


プログラム

 

/FQ_232cOut


 #include <3664.h>


void a_brink(void);
void b_brink(void);
void c_stream(void);
void d_stream(void);

char txb[10], rxb[10];
char b[20];
 
void msecwait(int msec)
    /*なにもしない時間稼ぎ関数*/
{
    int i,j;
    for (i=0;i< msec;i++) {
    for (j=0;j<1588;j++); /*1588は約1/1000s*/
    }
}

int main(){

    char data;
    
	IO.PMR1.BYTE=0x00;	/* 全て0にセットし、ポート使用に設定 0000 0000*/
	IO.PCR1=0xFF;		/* 全て1にセットし、出力に設定 1111 1111 */
				/* PCRレジスタは IO.PCR1.BYTE 記述でない!*/
	IO.PUCR1.BYTE=0x00;  /* 全て0にセットし、プルアップなし*/ 


  SCI3_INIT(br38400, txb, sizeof(txb), rxb, sizeof(rxb));       //初期化

 EI;                  //割り込み許可


    SCI3_OUT_STRING ("\n入力した文字をオウム返しに出す\n");//文字列送信関数
        SCI3_OUT_DATA ('a');            //一文字送信関数
         SCI3_OUT_DATA ('\n');            //一文字送信関数
        SCI3_OUT_DATA ('b');            //一文字送信関数
         SCI3_OUT_DATA ('\n');            //一文字送信関数
        SCI3_OUT_DATA ('c');            //一文字送信関数
         SCI3_OUT_DATA ('\n');            //一文字送信関数
        SCI3_OUT_DATA ('d');            //一文字送信関数
    SCI3_OUT_STRING ("\nが入力した文字なら、LEDパターン点滅\n");//文字列送信関数

    while(1){

       SCI3_IN_STRING (b, sizeof(b) - 1);//文字列受信関数
       SCI3_PRINTF("[%s]\n",b);          //オウム返し表示
        data=b[0];
        switch(data) {
            case 'a' :  a_brink(); break;
            case 'b' :  b_brink(); break;
            case 'c' :  c_stream(); break;
            case 'd' :  d_stream(); break;
            
            default:    break;
        }
    }
}

void a_brink(void){
        IO.PDR1.BIT.B4=1; /* P14--pin20 */
        IO.PDR1.BIT.B5=1;
        IO.PDR1.BIT.B6=1; /* P14--pin20 */
        IO.PDR1.BIT.B7=1;
    msecwait(200);
        IO.PDR1.BIT.B4=0; /* P14--pin20 */
        IO.PDR1.BIT.B5=0;
        IO.PDR1.BIT.B6=0; /* P14--pin20 */
        IO.PDR1.BIT.B7=0;
    msecwait(200);
}
void b_brink(void){
        IO.PDR1.BIT.B4=0; /* P14--pin20 */
        IO.PDR1.BIT.B5=0;
        IO.PDR1.BIT.B6=1; /* P14--pin20 */
        IO.PDR1.BIT.B7=1;
    msecwait(200);
        IO.PDR1.BIT.B4=1; /* P14--pin20 */
        IO.PDR1.BIT.B5=1;
        IO.PDR1.BIT.B6=0; /* P14--pin20 */
        IO.PDR1.BIT.B7=0;
    msecwait(200);
}

void c_stream(void){
        IO.PDR1.BIT.B4=1; /* P14--pin20 */
        IO.PDR1.BIT.B5=0;
        IO.PDR1.BIT.B6=0;
        IO.PDR1.BIT.B7=0;
    msecwait(100);
        IO.PDR1.BIT.B4=0; /* P14--pin20 */
        IO.PDR1.BIT.B5=1;
        IO.PDR1.BIT.B6=0; 
        IO.PDR1.BIT.B7=0;
    msecwait(100);
        IO.PDR1.BIT.B4=0; /* P14--pin20 */
        IO.PDR1.BIT.B5=0;
        IO.PDR1.BIT.B6=1; 
        IO.PDR1.BIT.B7=0;
    msecwait(100);
        IO.PDR1.BIT.B4=0; /* P14--pin20 */
        IO.PDR1.BIT.B5=0;
        IO.PDR1.BIT.B6=0; 
        IO.PDR1.BIT.B7=1;
    msecwait(100);
}
void d_stream(void){
        IO.PDR1.BIT.B4=1; /* P14--pin20 */
        IO.PDR1.BIT.B5=0;
        IO.PDR1.BIT.B6=0; 
        IO.PDR1.BIT.B7=0;
    msecwait(50);
        IO.PDR1.BIT.B4=0; /* P14--pin20 */
        IO.PDR1.BIT.B5=1;
        IO.PDR1.BIT.B6=0;
        IO.PDR1.BIT.B7=0;
    msecwait(50);
        IO.PDR1.BIT.B4=0; /* P14--pin20 */
        IO.PDR1.BIT.B5=0;
        IO.PDR1.BIT.B6=1; 
        IO.PDR1.BIT.B7=0;
    msecwait(50);
        IO.PDR1.BIT.B4=0; /* P14--pin20 */
        IO.PDR1.BIT.B5=0;
        IO.PDR1.BIT.B6=0;
        IO.PDR1.BIT.B7=1;
    msecwait(50);
}

       

 

GDLの通信関数と使用例のような方法で、特別なところはないので、 上記ソースファイルとGDLの関数説明をみれば わかると思います。

初期化部分の関数では各種設定をしています。

 

SCI3_INIT(br38400, txb, sizeof(txb), rxb, sizeof(rxb)); //初期化 ここでは通信速度を br38400 とボーレート38400にしています。
ハイパーターミナルの設定もこの速度にあわせる必要があります。

 

割り込みにより送受信を行うので必ず割り込み許可 EI の設定が必要です。

送信された数値のうち
a~dを受け取ると case分岐で各パターンのLED点滅関数を呼んでいます。

 

点滅関数では
わかりやすくビット操作       IO.PDR1.BIT.B4=1; /* P14--pin20 */
のようにしていますが、こういう切り替えは本来は8ビットを一度に設定するバイト操作にすべきです。

 

 

 

実行する

 

●ハイパーターミナルの設定

ハイパーターミナルは TekRobo工作室の
パソコンとシリアル通信する 109-4.ソフトsertest1の動作説明
ハイパーターミナルの設定は上記HPで親切に手順が説明されているのでわかりやすいと思います。

 

1.ハイパーターミナルを立ち上げる   からのところと同じです。

4.ハイパーターミナル準備完了
までいけば、接続の準備は整いました。

* このHPの通信では速度をbr38400 とボーレート38400にしています。
ハイパーターミナル側でも初期設定で通信速度をこの速度にあわせる必要があります。

 

5.AKI-H8の電源を入れる

 

3664Fを実行します。H8と接続されます。
すると まず     3664F → PC へ  
SCI3_OUT_STRING    //文字列送信関数
SCI3_OUT_DATA ()   //一文字送信関数

で 文字が送信され↓のような表示がでます。

 

ハイパーターミナル画面

 

 

●文字をパソコンから送信する

続いて、パソコンから文字を何か入力し、リターンを押すと
 ・PC → 3664Fへ   入力した文字が送られ
  H8は SCI3_IN_STRING (b, sizeof(b) - 1);//文字列受信関数  で受け取ります

 

3664Fは 受け取った文字をすぐに
 ・3664F → PCへ
SCI3_PRINTF("[%s]\n",b); //オウム返し表示   で送信して
PCのハイパーターミナルへ入力した文字がオウム返しに表示されます。

 

●LEDを操作

PCから送った(入力した)文字が a,b,c,d のいずれかの場合
switch で 対応するLED点滅関数を呼んで、LEDがパターンに点滅します。

 

GDLの関数を使用したので、難しいことは考える必要はなく、とりあえず、PCとH8-3664Fとを接続し、通信してみたといったところです。

 

スポンサーリンク
  • facebook
  • twtter
  • google+
  • hatena