Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

PDG2で生成されるソースコードを用いたシリアル通信について

お世話になっております。

マイコン初心者にアドバイスをお願いいたします。

PDG2(V.2.09)を用いてe2 studio(V.6.0.0)でソースコードを生成し、

マイコン(RX63T)とTeraTerm(V.4.96)でシリアル通信を行っています。

E1デバッガを用いてPDG2のライブラリファイルの動作を確認しているのですが、

TeraTermのマクロで4byteのデータ”ABCD”を送信しても、

ソースコード内のR_PG_SCI_StartReceiving_C1(data, 4);のdata内に1byteしか書き込まれていません。

ソースコード

void main(void)
{
while(1)
{
//R_PG_SCI_ReceiveAllData_C1(data,4);
//R_PG_SCI_SendAllData_C1(data,4);
R_PG_SCI_StartReceiving_C1(data, 4);  ☆ここに1byteのデータしか入っていません。
R_PG_SCI_StartSending_C1(data, 4);    ☆ここに1byteのデータしか入っていません。
}
}

//全データを受信すると呼び出される受信終了通知関数
void Sci1ReFunc(void)
{
//SCI1通信終了
R_PG_SCI_StopCommunication_C1();
}
//全データが送信されると呼び出される送信終了通知関数
void Sci1TrFunc(void)
{
//SCI1通信終了
R_PG_SCI_StopCommunication_C1();
}

想定としては、data内に4byteのデータが格納されるはずなのですが、うまくできません。

分かる方ご教授お願いいたします。

8666.RX63T_3.zip

  • わわいです
    PDG2ってのはよーわかりませんが、R_PG_SCI_StartReceiving_C1って関数は果たして4文字受信するまで待ってくれる関数なんでしょうか。そこら辺ドキュメントを読んで確認してください。

    普通に考えると、呼び出した時点での受信文字を返す関数だと思われます。
    そうであれば、送信直後に呼び出したら最初の1文字だけが返ってくるという動作になりますねー
    その場合は、4文字受信するまで待つコードを書かないといけませんねー
  • In reply to わわい:

    わわいさん
    マニュアルを読んだのですが、指定した数のデータ受信完了時に指定した名前の関数が呼び出されます。
    と書いてあり、今回のコードの場合は4byteのデータを指定しているつもりなのですが…
  • In reply to TOK:

    わわいです
    ちとぐぐってドキュメントを見てみました

    ---
    本関数はすぐにリターンし、指定した数のデータ受信完了時に指定した名前の関数が
    呼ばれます。通知関数は次の定義で作成してください。
    void  <通知関数名> (void)
    ---

    ということですので、この関数は受信を開始するだけの関数のようです。
    受信文字列を取得する関数はべつに定義する必要があるようですねー

    #しかし、ルネサスのトップページでPDG2で検索したらカフェルネしか出てこないのはどーにかならんもんか。。
  • In reply to わわい:

    わわいです
    受信文字列を取得する関数、ではなくて、その文字分の受信が終了したことを通知する関数、ですねー
    その関数でなんかフラグをセットして、メインループでそのフラグが立つまでループしておく、という処理になろうかと思われます。

    そこで注意すべきは、そのフラグには volatile のキーワードをつけておかないとヤバイってことですね。
  • こんにちは。circleです。

    RX63Nで開発環境はCS+になりますが、過去の投稿にある
    以下が参考になるのではないかと思います。
     ↓
    japan.renesasrulz.com/.../rx63n-sci
  • In reply to わわい:

    わわいさん
    回答ありがとうございます。
    そうなんですね、すこし考えてみます。
  • In reply to circle:

    circleさん
    回答ありがとうございます。
    そちらの投稿を参考にしていましたが、uint8_t send_buf[] =”Hello World"となっており、
    私もuint8_t data[4]=”ABCD"とするとうまく通信できるのですが、
    TeraTermのマクロを使用して”ABCD"を送信しようとするとうまくいかずに困っています…
  • In reply to TOK:

    わわいです

    >私もuint8_t data[4]=”ABCD"とするとうまく通信できるのですが、

    あ、それダメですw
    "ABCD" という文字列は5文字分必要です。文字列終端の '\0'が入るところが必要となります。

    #最初の質問の data はどういう定義になってるんだろう。。

    追記:ああ、元の送受信関数は文字列の想定でもないからこれでもいいのか。
    ドキュメント読む限り、コード生成のところで通知関数を登録するようになってるとみえるけど、そこらへんどーしました?
       

  • In reply to わわい:

    わわいさん
    回答ありがとうございます。
    通知関数の登録はPDG2上で設定を行い、そこで生成される通知関数を用いています。
  • In reply to TOK:

    わわいです
    なら、その通知関数が呼び出されるまで待つ処理をあなたのプログラムに追加すれば、あなたの意図通りの動作をするようになります。
  • In reply to わわい:

    わわいさん
    回答ありがとうございます。
    そもそも1byteしか”data”の中に格納されていないので、
    全データ受信が完了しておらず、通知関数が呼ばれていません…
  • In reply to TOK:

    わわいです
    そりゃ通知関数が呼ばれる前に読みに行ったらそりゃ 1byte でしょ。
    呼ばれるまで待たなきゃ。

    いつまでたっても呼ばれない、というなら、Teratermのマクロがおかしくて4バイト送信してないか、あなたのコードが根本的におかしいか、というはなしになります。

    CPUのRxDをオシロで見て、信号がちゃんと来ているか見てみればどーでしょうか。

  • In reply to わわい:

    わわいさん
    回答ありがとうございます。
    TeraTermのマクロは大丈夫だと思いますので、コードの方にミスがあると思います。
    オシロで信号の確認をしてみます。
  • TOKさん、こんにちは。NoMaYです。(以前の別のスレッドの時から2ヶ月ほどでしょうか。)

    以前に関わったスレッド(PDG2+RX62N)でも、うまく受信が出来ない(その時は全く(?)受信出来ず)がありました。そのスレッドでは、最後どうなったかは分からなかったのですが、今回はひとまず1バイト受信出来ているということですね。

    ここまでの流れで、現在、以下のような状況なのだと考えています。

    ・単に"ABCD"の送信は出来る
    ・TeraTermからの"ABCD"を受信してTeraTermへエコーバックしようして、4バイト受信時に受信終了通知関数が呼び出されるようにした筈が、TeraTermから"ABCD"を送信した(筈)なのに呼び出されない
    ・暫く待ってからデバッガでブレークさせて受信バッファを確認したら1バイトしか入っていなかった

    デバッガが使えるということですので、オシロで通信を確認してTeraTermから4バイト送信されていたら、以下を確認してみてはどうでしょうか?(もし、まだ確認されていなければ、ですが。)

    ・単に"ABCD"を受信させようとした時には受信終了通知関数が呼び出されるのかどうか(デバッガでブレークポイントを設定してブレークするかどうか)

    void main(void)
    {
        while(1)
        {
            //R_PG_SCI_ReceiveAllData_C1(data,4);
            //R_PG_SCI_SendAllData_C1(data,4);
            R_PG_SCI_StartReceiving_C1(data, 4); //4バイトのデータを受信する
            //R_PG_SCI_StartSending_C1(data, 4); //4バイトのデータを送信する
        }
    }

    //全データを受信すると呼び出される受信終了通知関数
    void Sci1ReFunc(void)
    {
        //SCI1通信終了
        R_PG_SCI_StopCommunication_C1();
    }
    //全データが送信されると呼び出される送信終了通知関数
    void Sci1TrFunc(void)
    {
        //SCI1通信終了
        R_PG_SCI_StopCommunication_C1();
    }

     

  • TOKさん、こんにちは。NoMaYです。

    先ほどの話の前に、TOKさんが投稿されたコードですが、while(1)の最後で受信完了待ちも送信完了待ちもしていませんね。これって、R_PG_SCI_StartReceiving_C1()やR_PG_SCI_StartSending_C1()が繰り返し呼ばれてしまうことになりませんか?

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page