2

printf データをuartデバイスに送信しようとしています。write_r() 関数を適切に記述しました。

私が抱えている問題は、

  • 私が言ったらprintf(" My name is sam \n I am fine ");
  • そして次に私が言うときprintf(" I am back ");

1 つ目の問題: 「私の名前はサムです」しか表示されず、カーソルが次の行に移動してそこで停止します。

2 番目の問題: 「I am back」がまったく印刷されません。

を削除してみましたが\n、まだ2番目printfは印刷されません。に問題はありませんuart

\その後、ポインタが失われたように見えます。

マイコード

    int write(int file, char *ptr, int len) {

            #if !defined( OUT_8 )
        #define OUT_8(p,d)      (*(volatile char *)(p) = (char)(d))
        #endif
        #if !defined( IN_8 )
            #define IN_8(p)         ((*(volatile char *)(p)))
        #endif

        OUT_8(DUART1_UMCR1, 0x02); //Informs external modem or peripheral that the UART is ready for sending data
        OUT_8(DUART1_ULCR1, 0x03);
        OUT_8(DUART1_UIER1, 0x0f);
        OUT_8(DUART1_UFCR1, 0x8f);

        OUT_8(DUART1_UTHR, '\n');
        OUT_8(DUART1_UTHR, '\r');
        while (ptr!=NULL)
        {
            if (*ptr=='\n') // JUST A TRY to avoid \n bug
            {
             OUT_8(DUART1_UTHR, '\n');
             wait();
             *ptr++;
             *ptr++;
             OUT_8(DUART1_UTHR, *ptr++); // \n & \r when given through printf isNot working
             wait();
            }


            OUT_8(DUART1_UTHR, *ptr++); // \n & \r when given through printf is not working 
            wait(); // TODO:

            if(len==0)
                break;
            else
                len--;
        }

            OUT_8(DUART1_UMCR1, 0x00); // say that modem is not not ready. Connection over
            OUT_8(DUART1_UFCR1, 0x87);
            OUT_8(DUART1_ULCR1, 0x00); // Clear all the interrupts ! virtually shut the UART port
    errno = ENOSYS;
    return -1;
}
4

2 に答える 2

1

OPのI / Oがどこかにバッファリングされていると確信しています。and/orが送信さ
れるまで、出力は表示されません。\r\n

#if !defined( OUT_8 )
  #define OUT_8(p,d)      (*(volatile char *)(p) = (char)(d))
#endif

// make ptr a `const char *`
int write(int file, const char *ptr, int len) {
  OUT_8(DUART1_UMCR1, 0x02); //Informs UART is ready for sending data
  OUT_8(DUART1_ULCR1, 0x03);
  OUT_8(DUART1_UIER1, 0x0f);
  OUT_8(DUART1_UFCR1, 0x8f);

  while (len-- > 0) {
    OUT_8(DUART1_UTHR, *ptr++);
    wait();
  }

  // Force an EOL at the _end_ of transmission.
  OUT_8(DUART1_UTHR, '\n');
  OUT_8(DUART1_UTHR, '\r');
  wait();

  OUT_8(DUART1_UMCR1, 0x00); // say that modem is not not ready. Connection over
  OUT_8(DUART1_UFCR1, 0x87);
  OUT_8(DUART1_ULCR1, 0x00); // Clear all interrupts! virtually shut UART port
  errno = ENOSYS;
  return -1;
}

受信側でバッファリングが発生していると 思われます.UARTまたはデータを表示している端末で発生している可能性が高いです. OPは「カーソルは次の行に移動します」と言いました。UART には「カーソル」はありません。

于 2013-09-25T12:33:21.570 に答える