-1

この問題を解決するのに役立つサンプルコードまたはリンクを誰かに見せてもらえますか。端末を使って文字列を送受信したい。

今まで、これしか持ってなかった -->

    void usart_init(void)
    {

        UBRRH = 0x00;
        UBRRL = 95;
        UCSRB =  (1 << RXEN) | (1 << TXEN) | **(1<<RXCIE)**; 
        UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)|(1 << UCSZ1); 
    }

    ISR (USART_RXC_vect)
    {
    PORTD= 0b00000100;  //enable RTS
    char ReceivedByte ;
    ReceivedByte = UDR ; // Fetch the received byte value into the variable " ByteReceived "
    UDR = ReceivedByte ; // Echo back the received byte back to the computer
    PORTD= 0b00000000;  //disable RTS

    }
int main (void)
{
   usart_init();
   while(1)
    {
      sei();
    }
   return 0;
}

ただし、これは文字の送受信しかできません。このコードを変更して、文字列を送受信できるようにする方法。

助けてくれてありがとう:)

4

1 に答える 1

0

この質問は、他の質問に関連しています。私が見たところ、あなたは今、割り込み駆動型のアプローチを取りたがっています。

一般に、C で文字列がどのように処理されるかを理解しておく必要があります。本質的には、受信した文字を配列に書き込みます (受信バッファになります)。だから代わりに

ReceivedByte = UDR

あなたはこのようなものを書くでしょう

_ReceiveBuffer[i++] = UDR

_ReceiveBuffer は、このようなグローバル配列にすることができます

char _ReceiveBuffer[100];

例えば。明らかにバッファオーバーフローをチェックする必要があり、ポインター演算を使用して処理を行うことができますが、これで開始できるはずです。

コードに関するいくつかのコメント:

ISR (USART_RXC_vect) {
    PORTD= 0b00000100;  //enable RTS
    char ReceivedByte ;
    ReceivedByte = UDR ; // Fetch the received byte value into the variable " ByteReceived "
    UDR = ReceivedByte ; // Echo back the received byte back to the computer
    PORTD= 0b00000000;  //disable RTS
}

ISR 内からデータをエコー バックしたり、時間のかかる処理を行ったりしないでください。ISR をブロックするリスクがあります。この特定のコードは機能しますが、データが送信されるのを待っているわけではありません。これはお勧めできません。
また、ハードウェア ハンドシェイクも使用していますか? 以前の投稿では、そのようには見えないため、潜在的な RTS 信号が切り替えられる 2 つの行を削除できます。

while(1) {
    sei();
}

連続して電話sei()しても意味がありません。sei()グローバル割り込みフラグを有効にします。これを 1 回行うだけで十分です。

基本的な理解が不足しているため、C と AVR のチュートリアルを読むことをお勧めします。

于 2014-06-20T07:18:55.003 に答える