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

  • わわいさん
    回答ありがとうございます。
    そもそも1byteしか”data”の中に格納されていないので、
    全データ受信が完了しておらず、通知関数が呼ばれていません…
  • わわいです
    そりゃ通知関数が呼ばれる前に読みに行ったらそりゃ 1byte でしょ。
    呼ばれるまで待たなきゃ。

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

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

  • わわいさん
    回答ありがとうございます。
    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()が繰り返し呼ばれてしまうことになりませんか?

  • NoMaYさん
    回答ありがとうございます。
    R_PG_SCI_ReceiveAllData_C1(data,4)を使用した場合では、
    dataに”A"、”B"、”C"、”D"と順番に4byte格納されているのですが、
    R_PG_SCI_StartReceiving_C1(data, 4)を使用すると、
    data[0]に”D"しか格納されておらず、data[0]に”A"、”B"、”C"、”D"が順に上書きされており
    うまくいかないと考えていますが、どうすればよいのかわからないのが現状です。
  • TOKさん、こんにちは。NoMaYです。

    もしかすると投稿が行き違ったかも知れませんので、(while(1)の最後ではありませんが、) 受信完了待ちさせる例を別スレッド(PDG2+RX63N+RSPI)に投稿したことがありますので、参考になれば。

  • NoMaYさん
    回答ありがとうございます。
    whileについての回答見落としてました…すみません。
    コードを以下のように書き換えたところ、4byte送受信できました。
    void main(void)
    {
    R_PG_SCI_StartReceiving_C1(data, 4); //4バイトのデータを受信する
    //R_PG_SCI_StartSending_C1(data, 4); //4バイトのデータを送信する
    while(1);
    }
    //全データを受信すると呼び出される受信終了通知関数
    void Sci1ReFunc(void)
    {
    //SCI1通信終了
    R_PG_SCI_StopCommunication_C1();
    R_PG_SCI_StartSending_C1(data, 4); //4バイトのデータを送信する
    }
    //全データが送信されると呼び出される送信終了通知関数
    void Sci1TrFunc(void)
    {
    //SCI1通信終了
    R_PG_SCI_StopCommunication_C1();
    }
    while(1)についてはNoMaYさんのご指摘通りです。
    私の理解が不足しているせいで大変ご迷惑をおかけしました。