我一直在为我的升压转换器项目编写 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/