我有一个变量“value”,其中包含从串口接收的最后一条消息。 我有一个多行文本框“txtOutput”,显示从串行收到的所有消息。 我还有一个if语句,它过滤特定的消息以执行我在txtOutput_TextChanged下的操作,以便在每次有新消息时更新textBox6中的数字。
int turns = 0;
private void txtOutput_TextChanged(object sender, EventArgs e)
{
if (value == 1)
{
textBox6.text = turns.ToString();
turns ++;
}}
单击微动开关时,从连接到微处理器的串行端口收到消息“1”。微动开关正在监控转动非常缓慢的电机的旋转。
我的目标是在将其用于进一步实施RPM计数器之前使上述计数系统正确。 我现在遇到的问题是微型开关经常被按压太长时间(50到100微秒),我从串口接收到几个连续的消息(2或3),最终计算的转弯数比实际数量多。我在微控制器方面提供了一些延迟,但我不能用它来玩,否则在不同的速度我会遇到问题。 有没有办法只考虑从串口收到的一条消息,如果它们连续出现在同一类型内,比如说,1秒钟?
我会很感激一些想法和样本片段。 感谢
答案 0 :(得分:1)
在微处理器中实现代码,仅发送一次信号。与微型速度相比,微型开关关闭的时间较长,因此在打开之前,其闭合状态将被多次读取。此外,您必须处理微动开关触点的反弹,即在稳定之前由于机械抖动可能会有几种短的闭合/打开状态。
在我看来,上面是最好的解决方案,从源头处理问题。
如果您希望在接收端处理问题,您必须实时知道接收信号的所有可能频率,否则您如何过滤接收到的信号?
编辑: 所以你的速度如下: 12 rpm,信号之间的最短时间:5秒 0.5 rpm,信号之间的最大时间:120秒
因此,当您收到信号时,您知道在下一个GOOD信号出现之前至少需要5秒钟。
因此,此代码可能会滤除错误信号:
// code to filter out false signals
DateTime lastTimeSignalReceived = DateTime.Now;
double minimumTimeBetweenSignals = 4.9; // 12 rpm = 5 seconds between signals minimum
int turns = 0;
private void txtOutput_TextChanged(object sender, EventArgs e)
{
if (value == 1)
{
// the if statement is true only if at least 4.9 seconds has past since last signal
// which should filter out false signals
if ((DateTime.Now - lastTimeSignalReceived).TotalSeconds > minimumTimeBetweenSignals)
{
// at least 4.9 seconds since last signal
textBox6.text = turns.ToString();
turns++;
// set lastTimeSignalReceived to new time
lastTimeSignalReceived = DateTime.Now;
}
}
}