2017-06-29 7 views
1

私はC#とArduinoの間で通信できる必要があるプロジェクトに取り組んでいます。私は、Arduinoからデータが受信されたときにC#でタイマーを起動できるようにする必要がある問題に固執しています。タイマーがなくなると、電源を切るリレーが起動します。コードは次のようになります。レーザがトリガされたときC#シリアル受信制限

アルドゥイーノ

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; 
    } 

は今、それはちょうどそれがアイテムが通過するまで、私たちは無限にデータを取得したスパム。私ができることをしたいのは、ArduinoからVSに送られた最初のキャラクターだけであり、タイマーが再び無効になるまで、他のすべての入力を無視します。とにかくこれを行うにはそこにいますか?

答えて

2

arduinoファームウェアにコードを追加して、アナログ信号がスレッショルドを下回るのを待つことができます。ヒステリシスがある場合があります。 しきい値がtrueまたは1にトリップされたときにトリップされた変数を追加します。

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

Arduino_DataReceivedはイベントハンドラです。イベントが何かをするために何かを購読する必要があります。あなたはタイマーが無効になるまであなたが言うた直後に、その後、このデータを無視する場合

ArduinoSerial.DataReceived += ArduinoSerial_DataReceived; 

:どこかセットアップコードで、次のような行を持っている「我々は、データを持って!」次のような行を追加して登録を解除することができます。

ArduinoSerial.DataReceived -= ArduinoSerial_DataReceived; 

その後、もう一度受信を開始する準備ができたら、再度登録することができます。

入力を無視するときに、クラスレベルのブール値を使用してフラグを立てる方法もあります。ブロック内ですべてのC#コードをif (!Ignoring) { }のようにラップし、後ですべての呼び出しが無視されるようにIgnoringをtrueに設定します。再度応答する準備ができたら、Ignoringをfalseに戻してください。

関連する問題