UARTの通信

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

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

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

UART3で送信します。

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

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

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

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

  正しく動作しない。

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

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

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

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

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

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


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

    フルデュプレックス

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

    シングルエンド

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

    フルデュプレックス

    シングルエンド

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

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

    フルデュプレックス

    差動信号

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

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

    ハーフデュプレックス

    差動信号

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

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

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

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


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

    フルデュプレックス

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

    シングルエンド

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

    フルデュプレックス

    シングルエンド

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

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

    フルデュプレックス

    差動信号

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

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

    ハーフデュプレックス

    差動信号

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

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

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

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

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

  • ・RS442トランシーバを使ってもRS485トランシーバを二つ使ってもRS422は実現できる
    ・RS422トランシーバを使ってもRS485は実現できない
    →これ重要です。ただ、配線が多くなるのでRS422ってのは全二重にしたいとかRS232のシステムの物理層のみアプグレードになるのでまだ実システムでRS422を見たことがないです。

    RS485を使う時、皆さんはどうやってDE信号線の操作させていますか?先日、送信終了後のDE信号線を操作してバス開放するまでの規定時間が短い案件(最大0.5us、RS485通信タイプのアブソエンコーダ)があって、他の処理との優先順位の関係で、RS485の自分自身の送信データによる受信完了の割り込みのタイミングではたまに規程時間をオーバーするという目に会いました。最終的にはDTCを使ってDEピンにつながるGPIO出力ピンを直接操作するという方法で解決できましたが、RS485対応はどのマイコンでも何かしら一手間ありますね。

  • >RS485を使う時、皆さんはどうやってDE信号線の操作させていますか?

     送信部の出力を切断する信号制御ですか?

     送信が終了のフラグが有るので、ポーリングで監視するか割り込み処理を使い制御します。

  • TEIフラグってスマートコンフィギュレータ生成コードだと要因にならないですよね?生成コードはTXIのタイミングで送信データバッファが空になったタイミングでの割り込みとなり、内部のシリアル送信は最後の1データを送信し切ってない状態ですからDE信号の処理に使いたいタイミングより前なのです。なので常時受信で受信完了タイミングでって実装をしたのですが、0.5usってあっという間にですので、モーター制御とかやってる処理の優先度の方が高く設定している都合、DTCを持ち出す必要が出ました(TEIはDTCの動作要因にならないので受信完了を要因としました)。スマートコンフィギュレータを使わなければって言われそうですが、初期化ルーチンなどを全て自分で書けるレベルまで到達できてない若輩者でした。

  • RX621のデータシートのSCI関係に次のフラグが有ります。

    29.2.1.7 シリアルステータスレジスタ(SSR)

    TEND  送信完了フラグ

    TDRE   送信データエンプティフラグ

    TDRE は送信データをバッファに書き込んで良いと言うフラグ。絶え間なく連続でデータを送信する時、次のデータをバッファに書き込めると言うフラグ。

    TEND は最後のデータが送られて、ストップビットが送られた後に立つフラグ。TEND のタイミングで RS422/RS485 の出力を遮断してハイインピーダンスにします。

    昔の8251と言う調歩同期式のLSIだと TxE と言う信号が出ているので、これで制御すれば速い。TxE は TEND と同じです。TxE はLSIの信号ピンの名前、TEND はステータスレジスタの、あるビットの名前です。

    >TEIフラグってスマートコンフィギュレータ生成コードだと要因にならないですよね?

     どこのフラグかな?僕はハードウェアマニュアルを見て全部のレジスタを書き出してプログラムしています。スマートコンフィギュレータの事は分かりません。

    >DE信号の処理に使いたいタイミングより前なのです。

     それは前述の TDRE による割り込みですね。TEND による割り込みはスマートコンフィギュレータには無いんですか?

     最初の  さんの質問からだいぶ横道に逸れちゃったけど。