0

ATMEGA328P で割り込み駆動の UART 通信を実装しようとしています。私が達成する必要があるのは、UART 経由でコマンド (char 配列) を送信して、mainルーチン内の変数に値を抽出し、回路内の動作をプログラムできるようにすることです。

送信するデータの形式は次2 255 0 255 0 0 255 1000のとおりです: (RGB LED ランプ用です) 、RGB 2 色、およびlong intの値を記述します。modeduration

これまでのところ、これは私が持っているものですmain:

while(1)
{
    if(rxFlag==1){
        char * pEnd;
        mode = strtol(buffer,&pEnd,10);
        Ri = strtol (pEnd, &pEnd,10);
        Gi = strtol (pEnd, &pEnd,10);
        Bi = strtol (pEnd, &pEnd,10);
        Rf = strtol (pEnd, &pEnd,10);
        Gf = strtol (pEnd, &pEnd,10);
        Bf = strtol (pEnd, &pEnd,10);
        duration = strtol (pEnd,NULL,10);
        rxFlag=0;
    }

    switch(mode){
        case 1: // fixed color
            fixed(Rf, Gf, Bf);
            break;
        case 2: // yoyo pulse
            yoyo(Ri,Gi,Bi,Rf,Gf,Bf,duration);
            break;
        default:// red blinky
            fixed(0,255,255);
            _delay_ms(500);
            fixed(255,255,255);
            _delay_ms(500);
            break;

    }
}

そして、受信を処理する ISR (割り込みサービス ルーチン):

ISR(USART_RX_vect)
{   
   while ( !(UCSR0A & (1<<RXC0)) );
   if (rxn==80){ // if BUFFER_SIZE is reached, reset to start of buffer.
       rxn=0;
   }
   buffer[rxn++] = UDR0; // increment rxn and return new value.
   if(buffer[rxn]=='\0'){
    rxFlag=1; // notify main of receipt of data.
   }
}

ご覧のとおり\0、ストリームの最後に を検出した場合にのみ、変数の値を更新しようとしています。

それは(ISRで)のようなものです:

  • 着信バイトを読み取り、長さが最大 ​​80 バイトのバッファーに格納します。
  • が入ってきたら、\0処理する新しいデータがあることを main に知らせます

main

  • 新しいデータがある場合は、バッファを分割long intして値を保存します
  • 新しいデータ フラグをクリアする
  • 新しい価値観に従って行動する。

問題は、これが私が望んでいたように展開されておらず、ちょっと迷っていることです. switch変数が正しい値を持っている場合、ステートメントが正しく機能することはわかっています。問題を、通信/バッファの入力フェーズが壊れているか、変数の値の抽出が壊れているかのいずれかに絞り込みましたが、どちらか、または両方かはわかりません。

誰でも洞察を共有できますか?

4

1 に答える 1