2

PIC18Fを使用していて、ハイパーターミナル経由でデータを送信しようとしています。0.5秒ごとに1つのキーを押して低速でデータを送信すると、データを受信して​​正しくエコーしますが、高速でキーを押し始めると、MCUがロックされます。何が原因かわからない。

while(index<length){
    while(PIR1bits.RCIF==0); // Wait till char recieved
    sendData(str2,9); // confirm reception

    Delay1KTCYx(5); //delay because without it, it messes up.
    rxData[index]= RCREG; //char array
    index++;
}

ボーレートはPICとハイパーターミナルの両方で2400です。

これが受信ループです。sendDataは、「受信済み」と言って送信するデバッグコードです。それが凍結したことを私たちが知る方法です。

毎回同じ量のループでフリーズするわけではなく、データを入力する速度だけに依存します。

4

3 に答える 3

2

(私はMCUで作業しましたが、PICを扱ったことがないので、一般的な問題の解決に努めます)

  1. レシーバーエラーフラグはチェックしません。オーバーランフラグをクリアするまで、レシーバーはオーバーランエラー状態でロックアップし、それ以上受信しない場合があります。エラー状態のチェックを追加し、PICドキュメントに従ってそれらを解決します。

  2. 受信完了が示されたときに、受信したバイトをできるだけ早く読み取ることをお勧めします。そのため、のrxData[index]= RCREG;直後に移動してみてくださいwhile(PIR1bits.RCIF==0);。これにより可能性が低くなります

  3. sendDataのコードを表示していません。TXレディ状態とエラー状態のチェックを見逃している可能性があるため、ロックアップする可能性もあります。

  4. やる気のない遅延は、あなたがすでにどこかで間違っていることを示しています。それを削除してから、コードをデバッグしてみてください。

  5. 受信と送信を別々にテストする必要があります。最初に、送信機を確認します。受信せずにUARTを介して長いテキスト行を出力してみてください。(たとえば、「He​​lloworld!」プログラムを作成します:))

  6. 受信機コードのみを確​​認します。プログラムから送信を削除し、LED(電圧計、オシロスコープなど)を接続してGPIOピンを解放し、バイトを受信するたびにロジックレベルを切り替えます。実行するのに数クロックティックしかかからないので、受信やロックアップに介入するべきではありません。

于 2010-11-14T00:03:42.617 に答える
0

たぶん、「受信した」送信で忙しい間に2文字を送信すると、そのうちの1つが破棄され、到達することはありませんlengthか?

于 2010-11-13T23:39:38.707 に答える
0

ほとんどのマイクロコントローラーでは、UARTレシーバーのオーバーランにより、新しく受信したバイトが破棄され、フラグが設定されますが、レシーバーは引き続き正常に動作します。PICでは、レシーバーのオーバーランにより、CRENビットがクリアされてリセットされるまでUARTが停止します。

于 2010-11-16T21:43:30.600 に答える