C编程,无限循环意外停止

时间:2015-01-23 20:46:42

标签: c embedded host

我一直在研究我的升压转换器项目的c代码。一旦嵌入的代码上传到ilmatto(微处理器),电压就会稳定到Vwanted的初始值,在我的情况下是4。

但是,当我使用主程序发送替换Vwanted的值时出现问题,Vwanted的值确实被替换,但输出电压的值保持为4,这是替换之前的Vwanted值。

我试图printf Vwanted的值,检查替换是否成功,并且确实如此!

所以,我怀疑最初内部为(;;)运行,但是在Vwanted的替换值之后,程序再也不会进入内部for(;;)。当我使用putty和uart cable来观察返回数据时就证明了这一点。它打印"。"最初,没有我输入Vwanted的新值。但是稍后当输入新的Vwanted值时,putty不会打印任何内容。

如果这是真的,则意味着外部for(;;)循环似乎不起作用。

请帮帮我!!!

这里我在embedded.c程序中包含main函数,

int main(void)
{   
    uint16_t cnt =0;

    int duty_value = 210;
    char cmd[BUFFSIZE];
    //char tail[BUFFSIZE];
    int prm;
    int res;

    init_stdio2uart0();
    init_pwm();
    init_adc();

    double Vwanted = 4; //initialise voltage
    double *ptr = &Vwanted;
    //pwm_duty(duty_value);

    double v_out;
    double Verror;

    /* set LED pin as an output */
    DDRB |= _BV(PINB7);

    printf("\r\nIlMatto Coms READY!\r\n");

    for(;;)
    {   

        /* Following idea from jwaf1g14*/
        for(;;) 
        {       

            v_out = v_load()/0.150;

            Verror = Vwanted - v_out;
            printf(".");

            if (Verror < 0)
            {
                if (Verror < -4)
                {
                    duty_value = duty_value - 2;
                    pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */
                }
                else if (Verror > -4)
                {
                    duty_value = duty_value - 1;
                    pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */
                }
            }
            else if (Verror > 0)
            {
                if (Verror > 4)
                {
                    duty_value = duty_value + 2;
                    pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */
                }
                else if (Verror < 4)
                {
                    duty_value = duty_value + 1;
                    pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */
                }
            }
            else
            {
                pwm_duty(duty_value);    /* Limited by PWM_DUTY_MAX */
            }

            if(kbhit()) // Check if there is an input available
            {
                res = scanf("%s %u", cmd, &prm);

                printf("%04d: CMD was: \"%s\" with %d (%d)\r\n", cnt, cmd, prm, res);

                break;
             } 

        //printf( " Vout -->  %5.3f V\r\n", v_out );

    }/*End of inner forever loop*/

    if ( res !=2 )/* Error! */ 
        {   
            printf("Your serial connection is broken!!!");
            //scanf("%*s");  /* Clear input buffer */
            //fflush(stdin);


        } 
    else
        {   
            if ( prm > 12 || prm < 1)
            {
                printf("The setpoint entered cannot be achieved");

                /* Set pin B7 high */
                PORTB |= _BV(PINB7);
                _delay_ms(100);
                /* Set pin B7 low */
                PORTB &= ~_BV(PINB7);
                _delay_ms(900);
            }
            else if ( prm < 12 && prm > 1)
            {

                *ptr = (double)prm;
                printf("Vset is %f,", Vwanted);

                //printf("Hello");
            }

        }


    }/*End of outer forever loop*/

    return 0;

}/*End of main loop*/

1 个答案:

答案 0 :(得分:2)

你的循环以return Vwanted;结尾,它将从主函数返回,结束你的程序。消除该行将允许您的外循环继续。我怀疑你不想从这个功能中返回任何东西。