做 while 循环过早退出
do while loop exiting pre-maturely
我已经编写了读取开关状态的代码,并在按 3 次 # 时退出。
void allkeypadTest(void)
{
static uint8_t modeKeyCount=0;
do
{
uint8_t key=getKeyStatus();
if(key)
{
if(key=='#')
{
modeKeyCount++;
//pulseIODevice(LED1,1,500,200);
}
else
{
pulseIODevice(LED1,key-0x30,500,200);
}
}
}while(modeKeyCount<3);
}
但是只要我输入#键一次,循环就退出了。如果我按其他键,则行为正常。但是,如果我取消注释 if(key=='#')
部分下的 pulseIODevice
,行为是正常的。 pulseIODevice
将在特定周期内将 LED 切换特定时间并将 PWM 传递给它。我对我的代码出了什么问题感到困惑。请注意,如果未检测到任何键,getKeyStatus
将 return '[=15=]'
(空),并且 return 1x4 键盘键的 ASCII 值(ASCII 值 3、6、9 和# 只)
一个可能的原因可能是 getkeyStatus() return 当您只按一次时,“#”不止一次。键盘设备可能需要一些睡眠时间来清除其缓冲存储器,即只要您按下一个键,它就会存储到缓冲区中,该缓冲区会多次出现。
尝试
一个。如果可能的话 printf("%c\n", key) 然后只按一次,看看打印了多少次。
b。是否有清除关键功能的功能?或者睡眠(x 毫秒)。
c。当您取消注释 pulseIODevice () 时,它的正常工作可能是由于 pulseIODevice () 阻塞了几毫秒,此时按下的键已从键盘缓冲区中清除。
检测到按键状态后,您可能希望等到它变回正常(未按下按键)后再继续
这样做改变
uint8_t key=getKeyStatus();
成为
uint8_t key = getKeyStatus();
while (0 != getKeyStatus())
{
/* Do nothing.
Shouldn't loop too long if not abused by holding the key pressed. */
/* if available add some milli sec delay here. */
}
效率更高一点点,甚至更准确一点点就是
uint8_t key = getKeyStatus();
if ( 0 != key)
{
do
{
/* Do nothing.
Shouldn't loop too long if not abused by holding the key pressed. */
/* If available add some milli sec delay here. */
} while (0 != getKeyStatus());
}
背景:
根据定义,要从状态变化("key down"、"key-up" 此处)检测事件("key pressed" 此处),您需要测试多次。
我已经编写了读取开关状态的代码,并在按 3 次 # 时退出。
void allkeypadTest(void)
{
static uint8_t modeKeyCount=0;
do
{
uint8_t key=getKeyStatus();
if(key)
{
if(key=='#')
{
modeKeyCount++;
//pulseIODevice(LED1,1,500,200);
}
else
{
pulseIODevice(LED1,key-0x30,500,200);
}
}
}while(modeKeyCount<3);
}
但是只要我输入#键一次,循环就退出了。如果我按其他键,则行为正常。但是,如果我取消注释 if(key=='#')
部分下的 pulseIODevice
,行为是正常的。 pulseIODevice
将在特定周期内将 LED 切换特定时间并将 PWM 传递给它。我对我的代码出了什么问题感到困惑。请注意,如果未检测到任何键,getKeyStatus
将 return '[=15=]'
(空),并且 return 1x4 键盘键的 ASCII 值(ASCII 值 3、6、9 和# 只)
一个可能的原因可能是 getkeyStatus() return 当您只按一次时,“#”不止一次。键盘设备可能需要一些睡眠时间来清除其缓冲存储器,即只要您按下一个键,它就会存储到缓冲区中,该缓冲区会多次出现。
尝试
一个。如果可能的话 printf("%c\n", key) 然后只按一次,看看打印了多少次。
b。是否有清除关键功能的功能?或者睡眠(x 毫秒)。
c。当您取消注释 pulseIODevice () 时,它的正常工作可能是由于 pulseIODevice () 阻塞了几毫秒,此时按下的键已从键盘缓冲区中清除。
检测到按键状态后,您可能希望等到它变回正常(未按下按键)后再继续
这样做改变
uint8_t key=getKeyStatus();
成为
uint8_t key = getKeyStatus();
while (0 != getKeyStatus())
{
/* Do nothing.
Shouldn't loop too long if not abused by holding the key pressed. */
/* if available add some milli sec delay here. */
}
效率更高一点点,甚至更准确一点点就是
uint8_t key = getKeyStatus();
if ( 0 != key)
{
do
{
/* Do nothing.
Shouldn't loop too long if not abused by holding the key pressed. */
/* If available add some milli sec delay here. */
} while (0 != getKeyStatus());
}
背景:
根据定义,要从状态变化("key down"、"key-up" 此处)检测事件("key pressed" 此处),您需要测试多次。