UARTの通信

UARTの通信で親機と子機間で通信を行っています。

親機、子機とも同じプログラムを動作させています。

親機はUART1でPCからデータを受信し、自分宛ではない場合子機にそのままデータを

UART3で送信します。

子機はUART3で受信した内容の処理を行い、UART3で親機にデータを返します。

親機はUART3で受信したデータをUART1でPCにデータを送信するプログラムです。

下記2点についてお教え下さい。

1.デバッガーを接続した状態だと上手く動作するのに、書き込んで動作させると

  正しく動作しない。

  症状は数バイト余分に0のデータを受信してしまいます。

2.送信をする時に受信割り込みを発生しないようにしたい。

以上、宜しくお願いします。

  • チョコです。

    >書き込んで動作させると正しく動作しない。

    情報が少なすぎますが、考えられる要因として、リセット解除してから通信相手の通信準備ができていないのに、通信を開始してしまっているのではないでしょうか。

    親機と子機の電源の立ち上げタイミングの差はどうなっていますか。

    電源の立ち上がり関係を確認してみてください。

    以上

  • チョコです。

    >2.送信をする時に受信割り込みを発生しないようにしたい。

    受信割り込みを発生しないようにするにはSCRレジスタで受信を禁止すればいいのですが、それは推奨できません。

    それよりはSRMKnビットで割り込みをマスクしておくべきでしょう。そのうえで、送信が終わったらマスクを解除すべきです。

    理想的には、受信は常時動作し、受信データはバッファに格納しておくべきです。そうしないと、受信データがなくなってしまいます。

    やりたいことの詳細が分かれば、もっと細かなコメントができるのですが。

    以上

  • 通信線を並列接続するRS-422を検討したらどうでしょう。

  • 並列接続というのはマルチドロップ接続という意味でしょうか?それはRS485では?

    ただ、質問内容の回答としては本質ではないと思いました。


    ・単なるUART(通信相手は1ノード)

    フルデュプレックス

    マイコンポートからマイコンロジックで直接つなぐ

    シングルエンド

    ・RS232(通信相手は1ノード)

    フルデュプレックス

    シングルエンド

    トランシーバICを使って電圧範囲を変更している(±5から±15V)

    ・RS422(通信相手は1ノード)

    フルデュプレックス

    差動信号

    電圧振幅は±2から±5V

    ・RS485(通信相手はNノード)※N数は電気的特性が許す範囲において

    ハーフデュプレックス

    差動信号

    電圧振幅は±2から±5V

    UART通信でもボード上の通信なら複数ノード通信可能です。RXラインを全マイコンで監視し、プルアップした状態にし、送信マイコンがオープンドレイン(吸い込みのみ)で動作するようにすれば実現できます。

  • 1)
    デバッガを接続した状態だと動作する。これは「デバッガーで一度、ブレイクが入った後の再開がある」からだと思います。他の通信ノードとデータをやりとるするにあたり、それぞれの初期化完了までのシーケンスのタイミングが取れないのだろうと思います。マイコンが中継リレーをする実装なのですよね?まずはPCと一台目のノード間で取りこぼしなく実装してみて様子を見た方がいいように思います。余分な0のデータの受信があるとのことですが、もしかするとmain関数の初っ端の実動作開始前の初期化ルーチン前で1秒弱のビジーウェイトを設けると解決するかもしれません。

    2)
    もし、送信中に受信割り込みを禁止すると自分の送信中に受信データが来たときに取りこぼしになると思います。私なら「受信割り込み優先度>送信割り込み優先度」として送受信ともバッファリングを使い取りこぼしをなくす作りにします。送信処理と受信データの解析はバックグランド処理で行うのが良いと思います(もしくは送受信より優先度の低いタイマ割り込みなどを作ってサイクリック処理)。

  • あとRXマイコンを使用していた場合、かつ、スマートコンフィギュレータの生成コードを利用している場合、多重割り込みが許可されないのがデフォルトなので要注意です。

  • チョコです。

    RL78でも、コード生成やスマートコンフィギュレータは多重割り込みには対応出来ていませんよ。

    (RL78のフォーラムなので、RXは関係ありません。)

    以上

  • マイコン関係なく多重割り込み許可してないんですね。これはルネサス側の人間はどう考えて、今のままを継続しているだろうか?

    トピック違いですが今のスマートコンフィギュレータ仕様は勘弁してほしい。せめて「コード生成」ボタンを押す以外での自動生成は禁止して欲しい。手で修正した後、クリーンビルドした時にも自動生成が勝手に走るのにもうんざり。

    SCI調歩同期モードの生成コード、せめて、バッファリング処理部分の前後にユーザー処理を追記できるコメント行を追加して欲しい。そうしたら割り込み許可マクロを割り込みハンドラの先頭で追記でき、コード生成のたびの修正作業に追われる心配がなくなるのに。バッファリング処理が生成コードで実現しているシリアル系のものはほぼ同じことを感じます(SPI動作モード、I2Cマスターモード)。

  • >並列接続というのはマルチドロップ接続という意味でしょうか?それはRS485では?

    ああ、そうですね。指摘有難う御座います。

    通信用ICには RS422/RS485 と書いて有るから、あまり気にする事は有りませんでした。

  • チョコです。

    >これはルネサス側の人間はどう考えて、今のままを継続しているだろうか?

    ずっと前から、要求はしているのですが、採用してもらえません。それ以外にも、シリアル系の処理には問題が大ありだと問題提起をしています。通信は、相手があるものだということをきちんと理解していない人がたくさんいますよ。

    それでも、スマートコンフィギュレータでは、個々のコンポーネントで独立しているので、初期化だけを利用し、そのほか自作することで、比較的簡単に多重割り込みに対応できるようにはなります。

    さらに、いつもクレームをつけているのが、通信完了まできちんとサポートしていないことです。割り込み処理の中で、コールバックで対応していると言っているようなのですが、割り込み処理の中で時間がかかるような処理をやらせることは問題だと思っています。(これでも、少しは進歩してきているのですが。)

    手で修正した後、クリーンビルドした時にも自動生成が勝手に走るのにもうんざり。

    クリーンビルドは気にしたことはありませんが、最初から初期化以外は使わないのも選択肢の一つです。

    また、RL78のアプリケーション・ノート(サンプル・コード)には、条件付きコンパイル(#ifdef)とユーザ領域を使って、コード生成された処理は全て無視してフルスクラッチのプログラムを使っているのを見たことがあります。これなんかは、Yamamoto の言っている「せめて、バッファリング処理部分の前後にユーザー処理を追記できるコメント行を追加して欲しい。」をができないので、強引にインプリメントしている例でしょうね。

    以上