【发布时间】:2020-11-02 19:28:03
【问题描述】:
我目前正在开展一个项目,该项目利用编码器来跟踪一系列丝杠的位置。此代码块用于获取每个编码器的位置并通过 while 循环(未按下任何键)将其显示给用户,同时还为他们提供将三个位置中的任何一个重置为零的选项(通过按下任一键盘上的“x”、“y”或“z”)。
按原样,用户需要按“x”键一次将 x 位置归零,按“y”键 2 次将 y 位置归零,按“z”键 3 次归零z 位置和 4 次结束程序。为了使开关/案例发生而需要按下键的次数对应于它在案例列表中的数字位置。但是,我需要每个键只按一次以执行操作。我将如何着手修复开关/案例结构(或其他任何东西)以实现这一目标?
此外,它似乎不喜欢第一个 switch 语句中的 !Console.KeyAvaible 来检查是否已按下某个键。错误是“无法将 bool 转换为 System.ConsoleKey”。还有另一种说法吗?
while (true){
long Position0 = encoder0.Position;
long Position1 = encoder1.Position;
long Position2 = encoder2.Position;
ConsoleKeyInfo input = Console.ReadKey();
switch (input.Key){
case !Console.KeyAvailable:
// initialize encoder positions and do math to convert to mm
float Position0f = Convert.ToSingle(Position0);
float Position1f = Convert.ToSingle(Position1);
float Position2f = Convert.ToSingle(Position2);
float LinearPosition0 = Position0f / 400;
float LinearPosition1 = Position1f / 400;
float LinearPosition2 = Position2f / 400;
Console.SetCursorPosition(0, 0);
Console.WriteLine("x Position: {0:0.0000##} mm", LinearPosition0);
Console.SetCursorPosition(0, 1);
Console.WriteLine("y Position: {0:0.0000##} mm", LinearPosition1);
Console.SetCursorPosition(0, 2);
continue;
default:
switch (input.Key){
case ConsoleKey.X:
Console.WriteLine("\nYou selected X!");
Position0 = 0;
break;
case ConsoleKey.Y:
Console.WriteLine("\nYou selected Y!");
Position1 = 0;
break;
case ConsoleKey.Z:
Console.WriteLine("\nYou selected Z!");
Position2 = 0;
break;
case ConsoleKey.Escape:
Console.WriteLine("\nYou selected Esc! Exiting program.");
break;
default:
break;
}
break;
}
}
除了键的问题外,第一个if语句中显示的位置没有变化。我应该在哪里初始化 Position0/1/2 以便它们可以在第二个 if 语句中重置为零,同时仍然在第一个循环中更新?
【问题讨论】:
标签: c# while-loop switch-statement keypress encoder