-1

この機能について多くの質問が寄せられていることは知っていますが、ここで何時間も検索しても、これを理解するのに役立つ答えが見つかりません.

これは、実装しようとしている UART を介して文字列を読み取る関数です。

void UART_Read_Text(char *Output, unsigned int length)
{
  unsigned int i;
  for(int i=0;i<length;i++)
  Output[i] = UART_Read();
}

グローバルに定義された label と呼ばれる 16 文字の配列があります。この配列に UART データを受信したいと考えています。

これが私がそれを使用しようとしている方法です。

UART_Read_Text(label,16);

誰かが私が間違っていることに光を当てることができますか? 覚えておいてください、私は UART TX 機能がうまく機能しているので、適切にセットアップしました。また、割り込みを使用する必要がないようにしていますが、それが私が行かなければならない方法かもしれません。どんな助けでも大歓迎です。

4

2 に答える 2

0

デバッガーを使用してブレークポイントを配置し、コードをステップ実行してみましたか? UART_Read() の出力を印刷して、何かを出力しているかどうかを確認することもできます。

また、削除

unsigned int i;

その後の記述と矛盾するので紛らわしいです。同じステートメントで int として宣言されているため、コンパイラが i の初期化を 0 に削除している可能性がありますか?

于 2015-11-15T23:12:46.117 に答える
0

今夜はうまくいきました。私は実際に割り込みサービスルーチンを使用することになりました。他の方の参考になればと思い投稿させて頂きます。

void interrupt ISR() 
{
    if (PIR1bits.RCIF)          // see if interrupt caused by incoming data
    {
        UART_Read_Text(Output,16); //replace "Output" with the array that you want populated.
        PIR1bits.RCIF = 0;      // clear interrupt flag
    }
}

また、これらのバージョンの関数は問題なく動作しているようです。ただし、いくつかのクリーンアップを行う必要がありますが、これは誰かが始める必要があります。

char UART_Read()
{
  while(!RCIF);
  return RCREG;
}

void UART_Read_Text(char *Output, unsigned int length)
{
  unsigned int i;
  for(int i=0;i<length;i++)
  Output[i] = UART_Read();
}

次のリンクで著者の功績を称えます。このコードで役立つ情報を見つけました。割り込みを制御するすべてのビットを設定してください。また、次のリンクからも参照できます。

https://gist.github.com/gshrikant/8549474

しかし、ここにそれらがあります:

    RCIF=0;   // make sure receive interrupt flag is clear
    RCIE=1;   // enable UART Receive interrupt, 1 to enable
    PEIE = 1; // Enable Peripheral interrupts //WAS ORIGINALLY 1
    GIE = 1;  // Enable global interrupts

助けようとしたすべての人にもう一度感謝します。常に高く評価されています。

于 2015-11-18T05:33:08.820 に答える