ATMEGA328P で割り込み駆動の UART 通信を実装しようとしています。私が達成する必要があるのは、UART 経由でコマンド (char 配列) を送信して、main
ルーチン内の変数に値を抽出し、回路内の動作をプログラムできるようにすることです。
送信するデータの形式は次2 255 0 255 0 0 255 1000
のとおりです: (RGB LED ランプ用です) 、RGB 2 色、およびlong int
の値を記述します。mode
duration
これまでのところ、これは私が持っているものです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
変数が正しい値を持っている場合、ステートメントが正しく機能することはわかっています。問題を、通信/バッファの入力フェーズが壊れているか、変数の値の抽出が壊れているかのいずれかに絞り込みましたが、どちらか、または両方かはわかりません。
誰でも洞察を共有できますか?