我正在开发一个项目,我需要能够在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的第一个字符起作用,然后忽略所有其他输入,直到再次禁用定时器。无论如何要做到这一点?
答案 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;
}