C#串行接收限制

时间:2017-06-29 19:50:36

标签: c# winforms visual-studio arduino serial-port

我正在开发一个项目,我需要能够在C#和Arduino之间进行通信。我遇到了一个问题,我需要能够在从Arduino接收数据时在c#中启动计时器,然后如果计时器用完,它会触发继电器关闭电源。代码看起来像这样。

Arduino的

char incoming_char=0;
#define RECEIVER_PIN A0
#define THRESHOLD 80

void setup() {
  Serial.begin(9600); //for debug
  pinMode(13, OUTPUT);
}

void loop() {
  incoming_char=Serial.read();
  // read the input on RECEIVER_PIN
  int sensorValue = analogRead(RECEIVER_PIN);
  if( sensorValue > THRESHOLD ) {
    Serial.print("A");  //Send a letter back to VS
    }
}

C#

public void TimerTick(object source, ElapsedEventArgs e)
{
    Tick++;
    System.Diagnostics.Debug.WriteLine("Ticking! " + Tick);
    if (Tick > 10)
    {
        UPCTimer.Stop();
    }
}
private void ArduinoSerial_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    System.Diagnostics.Debug.WriteLine("We GOT DATA!");
    if (UPCTimer.Enabled == false)
    {
        UPCTimer.Start();
        System.Diagnostics.Debug.WriteLine("We started the timer!");
        Tick = 0;
    }

现在,当激光被触发时,它只会无休止地淹没WE GOT DATA,直到物品通过。我希望能够做的只是对从Arduino发送到VS的第一个字符起作用,然后忽略所有其他输入,直到再次禁用定时器。无论如何要做到这一点?

2 个答案:

答案 0 :(得分:2)

Arduino_DataReceived是一个事件处理程序。有些东西必须订阅该事件才能使它做任何事情。在设置代码的某处,您有一行代码:

ArduinoSerial.DataReceived += ArduinoSerial_DataReceived;

如果要在禁用定时器之前忽略此数据,则在您说“We GOT DATA!”之后立即忽略此数据。您可以通过添加以下行来取消订阅:

ArduinoSerial.DataReceived -= ArduinoSerial_DataReceived;

然后,一旦准备好再次开始接收,您就可以再次订阅。

另一种方法是使用类级布尔值来标记何时忽略输入。将所有c#代码包含在if (!Ignoring) { }之类的内容中,并在该块中将Ignoring设置为true,以便忽略所有后续调用。当您准备好再次开始响应时,只需将Ignoring设置为false。

答案 1 :(得分:2)

您可以向arduino固件添加代码,等待模拟信号降至阈值以下,可能需要滞后,然后才能再次发送数据。 即,当阈值跳闸为真时添加跳闸变量或1.检查阈值时检查此值:

if( tripped == 0 && sensorValue > THRESHOLD ) 
{
    tripped = 1;
    //send A to serial port
}
else if( sensorValue < THRESHOLD - hysteresis )
{
    tripped = 0; 
}