2016-11-11 3 views
-2

Ich entwickle eine Konsolenanwendung, die Daten von einem Arduino über die serielle Schnittstelle lesen und schreiben kann. Wenn ich vom Arduino lese, muss ich warten, um eine Antwort von ihm zu erhalten, also ist das Bilden eines Timers die bessere Wahl.Erstellen eines Timers zum Aufrufen einer Methode in C#

Also ich habe diesen Timer erstellt und wird alle 2000 Millisekunden ausgeführt.

static void Main(string[] args) 
{ 
    SerialPort port = new SerialPort("COM1", 9600, Parity.Odd, 7, StopBits.One); 

    Timer t = new Timer(TimerCallback, null, 0, 2000); 

    port.DataReceived += Port_DataReceived; 

    port.Open(); 
} 

private static void TimerCallback(Object o) 
{ 
    //Call the method 
} 

Was ich tun möchte, ist diese Methode in die

private static void Port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort port = sender as SerialPort; 

     // Leitura de dados 
     string incoming = port.ReadExisting(); 
     string questionmark = "?"; 
     string carriageReturn = "\r"; 
     string text = string.Empty; 

     switch (incoming) 
     { 
      case "@r\r": 
       // send the message back 
       port.Write(questionmark + "*" + carriageReturn); 
       break; 
      case "@{/r": 
       port.Write("@" + text); 
       break; 
      default: 
       Console.WriteLine("Unknown command sent by the Arduino!\n Command: " + incoming); 
       break; 
     } 
    } 

TimerCallback nennen Wie soll ich das Port_DataReceived Methode aufrufen?

+0

Ich verstehe nicht, warum Sie einen Timer benötigen. Das Ereignis 'DataReceived' sollte immer dann ausgelöst werden, wenn die Daten am seriellen Port eintreffen. (Ich nehme an, dass Sie die' SerialPort' Klasse verwenden. Können Sie zeigen, wie Sie das Ereignis verkabeln? –

+0

Bereits aktualisiert den Beitrag @ChrisDunaway – Forrobodo

+1

Dieser Code scheint ein Problem zu haben, dass die Main-Methode sofort nach dem Öffnen der seriellen Schnittstelle beendet wird Sobald Main beendet ist, wird das Programm beendet Wie behalte ich das Programm am Leben, um Ereignisse zu empfangen –

Antwort

1

Es ist seltsam, dass Sie den Event-Handler direkt aus Ihrem Code aufrufen möchten?

Schlagen Sie eine neue Funktion vor, die von Ihrem Timer und auch vom Event-Handler aufgerufen wird.

Aber warum Sie das tun wollen, scheint immer noch stinkend zu mir.

0

Sie brauchen den Timer nicht. Entfernen Sie es.

Das Ereignis wird immer dann aufgerufen, wenn Daten an der seriellen Schnittstelle empfangen werden. Sie müssen es nicht selbst anrufen.

+0

Also halte ich 'private static void TimerCallback (Object o) 'leer? – Forrobodo

+0

Sie können sogar den Timer und die Timer-Methode entfernen, wenn Sie es später brauchen, aber ich bezweifle, dass Sie es brauchen werden - zumindest nicht für die serielle Kommunikation. –

Verwandte Themen