【解決方法】Keil UART 割り込みが printf() 関数でハングする


プログラムが printf() でハングします。

void UART0_ISR(void) interrupt 4
{
    if (RI == 1)
    {
            RI = 0;
            TI = 1;
            Count = 444;
            datau = SBUF;             // Read receive data
            SBUF = 0;// datau;           // Send back same data on uart
            Count=1;
            if(temp < 10)
            {
                temp =temp+1;
            }
            if(temp >10)
            {
                temp=0;
            }
            uartreceive=1;
            Count = 444;
        }
    else TI = 0;
}

void main() {

        AUXR1|=0x00;
        PCON&=0x7F;
        SCON  = 0x50;         // SCON: mode 1, 8-bit UART, enable rcvr
        TMOD&=0xAF;
            TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit reload
        TH1   = 0xFA ;                // TH1:  reload value for 1200 baud @ 16MHz
            TR1   = 1;                  // TR1:  timer 1 run
            TI    = 1;                  // TI:   set TI to send first char of UART
        ES = 1;                             // Enable serial interrupt
        EA = 1;
        Count=123;
        temp=0;
    while(1)
    {
        Delay_ms(100);
        Count=102;
        printf("sss\n %u",Count); //My program is getting hangs here

        if(uartreceive==1)
        {
            uartreceive=0;
            Count=4;
            printf("Entire array is %s  %u\n",datau,temp);
            Count=105;
            printf("\nindex  %u %c  %c\n",temp,datau[0],datau[1]);
            Count=106;
            sprintf(datau," ");
            Count=107;
            temp=0;
            uartreceive=0;
            Count=104;
        }

        }
     }

私が試したこと:

UARTを使用してPCから通信しようとしています。 動作していますが、while ループ内の printf() 関数でスタックします。 私が犯した間違いが何なのか分かりません。

解決策 1

UART 割り込みルーティングを TI = 0 に設定すると、printf がクラッシュします。クラッシュを避けるために、sprintf 以下の uart_sendstring を使用して printf を置き換えます。 UART 割り込みルーティングで TI = 0 を設定しなかった場合、UART ボーレートの周波数で UART 割り込みが継続的に発生し、多数の UART 割り込みの処理に CPU の計算能力が浪費されます。

uint8_t xdata pbf[100];
sprintf(pbf, “\033[2J\033[H”);
uart_sendstring(pbf, strlen(pbf));

//—————————————————————
void Send_Data_To_UART0 (UINT8 c)
{
TI = 0;
SBUF = c;
while(TI==0);
}

//—————————————————————
void uart_sendstring(uint8_t* s, uint8_t cont)
{
while (cont) {
Send_Data_To_UART0(*s++);
cont–;
}
}

コメント

タイトルとURLをコピーしました