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

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

  1. PICがゴミの様なデータを送信している。
    • クロックをチェックしてください。クリスタル発振を用いている場合であればまず間違いはありませんが、RCオシレーターを使っている場合は発振周波数をチェックしてください。 もし周波数がずれていたら、#use delayディレクティブで周波数をを調整してください。
    • PC又は、その他のホスト[ターミナル]のボーレートやパリティをチェックしてください。
    • RS232Cのレベル・コンバーターと出力レベルをチェックしてください。 MAX232などを使用している場合は、INVERTは不必要です。直接抵抗やダイオードを通じ て出力している場合は、INVERTが必要です。INVERTオプションは、#use rs232で指定し ます。
    • putc(6)はASCIIで6(ACK)を出力します。表示できる文字とするためには、文字コードを与えます。Aならputs('A')となります。

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

  3. 何も送られていない。
    • トライステート・レジスターの設定はどうなっていますか。また、ポートのモード(standard, fast, fixed)も#use rs232より先に定義されていると安定します。なお、ポートのモードはstandardモードが安定しています。
    • 次のプログラムをコンパイルして実行してみてください。:
      main() {
      	while(TRUE)
      		putc('U');
      }
      

      このプログラムを実行させると、XMITピンからUが出力され続けます。Uは0x55ですから、設定したボーレート分の1の方形波が出力される様子をオシロスコープなどで確認してください。また、レベルコンバータがある場合は、コンバーターの出力側もチェックしてみてください。
    • 何も受信していない様子です。最初に、PICから確実に送信できることを11〜3の内容を見て確認してください。 そして、次のmain()を実行してみてください。:
      main() {
      	printf("start");
      	while(TRUE)
      		putc( getc()+1
      );
      
      これでターミナルからAを入力するとBが返されるはずです。 これでも受信できないようなら、ハードウェアのチェックをおこないます。RCVピンに信号が入っているかなどターミナルから入力を行なって確認します。(一般的には、なにも信号が入力されない状態でRCVピンは'H'で、ターミナルのキーを押すと'L'のパルスが入ってきます)

  4. PICの受信や送信が全く出来ない訳ではなくRS-232を経由してデータを受信しているようです。
    • USE RS232のINVERTオプションがレベル・コンバーターと合致していますか。信号がなにも入力されない状態でRCVピンが'H'ならINVERTは不要です。'L'ならINVERTが必要です。また、送信と受信でレベルが異なっているハードウェアならどちらかにレベルを合わせて、後はハードウェアを改良します。
    • 何もデータがないとき、通信に使用しているピンが'H'か'L'のレベルになっていますか。
    • ポートAを使っている場合、SETUP_PORT_A()でポート設定が行なわれていますか。 ポートAにアナログポートが割り当てられているデバイスでは、デジタルI/Oはデフォルト設定ではありません。デバイスによってアナログ・ポートやコンパレータ・ポートとなっている場合があります。

  5. コンパイラーがINVALID BAUD RATEエラーを出力する。
    • これは内蔵UARTを使用しない場合は、クロックとボーレートの関係で誤差が大きかったり、設定できない組合せを行なっているためです。大抵、クロックに対してボーレートが速すぎます。
    • 内蔵のUARTを使っている場合も3%以内の誤差でボーレートが設定できない状態がほとんどありませんが、内部のBRGHのバグでBRGHに1を設定したとき、同じ状態になります。これを回避するには、BRGK10Kを#USE RS232ディレクティブに指定してください。