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文字受信するまで待つコードを書かないといけませんねー
  • わわいさん
    マニュアルを読んだのですが、指定した数のデータ受信完了時に指定した名前の関数が呼び出されます。
    と書いてあり、今回のコードの場合は4byteのデータを指定しているつもりなのですが…
  • わわいです
    ちとぐぐってドキュメントを見てみました

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

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

    #しかし、ルネサスのトップページでPDG2で検索したらカフェルネしか出てこないのはどーにかならんもんか。。
  • わわいです
    受信文字列を取得する関数、ではなくて、その文字分の受信が終了したことを通知する関数、ですねー
    その関数でなんかフラグをセットして、メインループでそのフラグが立つまでループしておく、という処理になろうかと思われます。

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

    RX63Nで開発環境はCS+になりますが、過去の投稿にある
    以下が参考になるのではないかと思います。
     ↓
    japan.renesasrulz.com/.../rx63n-sci
  • わわいさん
    回答ありがとうございます。
    そうなんですね、すこし考えてみます。
  • circleさん
    回答ありがとうございます。
    そちらの投稿を参考にしていましたが、uint8_t send_buf[] =”Hello World"となっており、
    私もuint8_t data[4]=”ABCD"とするとうまく通信できるのですが、
    TeraTermのマクロを使用して”ABCD"を送信しようとするとうまくいかずに困っています…
  • わわいです

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

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

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

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

  • わわいさん
    回答ありがとうございます。
    通知関数の登録はPDG2上で設定を行い、そこで生成される通知関数を用いています。
  • わわいです
    なら、その通知関数が呼び出されるまで待つ処理をあなたのプログラムに追加すれば、あなたの意図通りの動作をするようになります。