何故、RS232Cポートが思ったように動かなのでしょうか?

問題はいくつか考えられます。順に解説します。

  1. PIC® MCUがゴミの様なデータを送信している。
    • ターゲットのクロックを正確にチェックしてください。 クリスタルでは通常問題ではありませんが、RCオシレータはRS-232に問題を引き起こす可能性があります。 #USE DELAYが実際のクロック周波数と一致することを確認してください。
    • PC(又は、他のホスト[ターミナル])のボーレートやパリティが正しいかチェックしてください。
    • レベル変換を確認します。MAX 232などのドライバ/レシーバ・チップを使用する場合は、抵抗および/またはダイオードと直接接続するときはINVERTを使用しないでください。 #USE RS232にはINVERTオプションが必要です。
    • がASCII 6をPCに送信することを思い出してください。これは可視文字ではない可能性があります。 PUTC('A')は可視文字Aを出力します。

  2. PIC®がゴミの様なデータを受信している。
    • 上記の全ての内容(クロック、ターミナル設定、レベル)をチェックしてください。
      *送信中など他のタスクを行なっているときに受信データが入ってきて、データが失われてはいませんか。 getc()関数をもっとも高い位置(優先順位の高いところ)においてデータを落とさないようにプログラムを再構成します。
      もし、ポーリングでデータを得てる場合、kbhit()を使うと1/3の時間で受信データのチェックが行なえます。また、9600bpsのとき、kbhit()関数をおおよそ35μSで呼び出して受信をチェックしないとデータを落とします。

  3. 何も送られていない。
      トライステート・レジスターの設定が正しいことを確認してください。使用されるモード(standard, fast, fixed)は #USE RS232に遭遇した時のモードになります。デフォルトのSTANDARDモードを使用するのが最も安全です。
    • 次のmain()を使用してテストします。:
      main() {
      	                                  while(TRUE)
      		                                       putc('U');
                                    }
                
      ロジックプローブ、スコープなどを使用してXMITピンのアクティビティを確認してください。 スコープで見ることができる場合は、ビット時間(1/BAUD)を確認してください。 レベルコンバータの後にもう一度点検してください。
    • 何も受信していない様子です。まず、PIC® MCUがデータを送信できることを確認します。 テストには次のmain()を使用します。:
      main() {
      	                                 printf("start");
      	                                 while(TRUE)
      		                                    putc( getc()+1
                                     );
                
      PCに接続した時、Aを入力するとBがエコーバックされます。もし、なにも戻ってこない場合(初期の"Start"を除)、 PIC®MCUのRCVピンをロジックプローブでチェックします。 HIGH状態であることを見ることが出来ますが、PCでキーが押されたときパルスがLowになるはずです。 それがどこに失われているかを調べるためにバックトレースします。

  4. PIC®の受信や送信が全く出来ない訳ではなくRS-232を経由してデータを受信しているようです。
    • USE RS232のINVERTオプションがレベル・コンバーターと合致しているかチェックして下さい。 信号がなにも入力されない状態でRCVピンが'H'ならINVERTは不要です。'L'ならINVERTが必要です。 データが送信されていないときにRCVピンがHighの場合、INVERTは使用しないでください。 データが送信されていないときにピンがLowの場合、INVERTを使用する必要があります。 また、送信と受信でレベルが異なっているハードウェアならどちらかにレベルを合わせて、後はハードウェアを改良します。
    • 何もデータがないとき、通信に使用しているピンが'High'か'Low'のレベルになっているかチェックして下さい。
    • SETUP_ADC_PORTS関数をサポートするデバイスでPORT Aを使用する場合、ポートがデジタル入力に設定されていることを確認してください。 これはデフォルトではありません。 同じことがPORT Aのコンパレータを備えたデバイスにも当てはまります。

  5. コンパイラーがINVALID BAUD RATEエラーを出力する。
    • ソフトウエアRS232(内蔵UARTを持っていない)を使用する場合、高速のボーレートが使用されているときはクロックを実際には遅くすることはできず、遅いボーレートでは本当に速くすることはできません。 限界を見つけるためにクロック/ボーレート値を試してください。 クロックとボーレートの関係で誤差が大きかったり、設定できない組合せを行なっているためです。 大抵、クロックに対してボーレートが速すぎます。
    • 内蔵UARTを使用する場合、要求されるボーレートはエラーが発生しない場合に達成できるレートの3%以内でなければなりません。 一部のパーツにはBRGHが1に設定された内部バグがあり、#USE RS232ディレクティブでBRGH1OKを指定しない限りコンパイラはこれを使用しません。