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

标签 c embedded host

我一直在为我的升压转换器项目编写 C 代码。一旦嵌入式代码上传到 ilmatto(微处理器),电压就会稳定到 Vwanted 的初始值,在我的例子中为 4。

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

我尝试打印Vwanted的值,检查替换是否成功,结果成功了!

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

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

请帮帮我!!!

这里我将主要函数包含在我的embedded.c程序中,

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*/

最佳答案

你的循环以return Vwanted;结束,它将从主函数返回,结束你的程序。消除该行将允许您的外循环继续。我怀疑您不打算从此函数返回任何内容。

关于C编程,无限循环意外停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28118461/

上一篇:C:括号错误

下一篇:C 编程团队随机化

相关文章:

c - C编译涉及哪些内部过程?

lua - 从 C 回调闭包时 GC 中的 MemFault

linux - 主机:解析/etc/resolv.conf 失败

scala - 电梯项目主持人

c - Linux 中的鼠标事件处理?

c - 比较c中的两个char指针值时strcmp返回true

c++ - 侧翻安全计时器(滴答声)比较

php - ssh 所需的 IP 地址与服务器内部显示的 IP 地址有什么区别

c - Ftell 在 C 中返回错误大小的二进制文件

c - 如何解决我的小写函数遇到的这个问题