2017-04-18 4 views
0

Ich habe ein Problem mit meinem Code, ich möchte die serielle Schnittstelle dank DataReceivedHandler lesen, aber ich arbeite nur einmal. Dieser serielle Port ist ein EnOcean-USB-Stick, der Daten von einer elektronischen Karte empfängt, wenn ich einen Knopf darauf drücke. Die Daten senden sind 24 Bytes. Erstes Drücken der Taste funktioniert einwandfrei, ich erhalte die Daten, aber wenn ich ein zweites Mal drücke, passiert nichts, der DataReceivedHandler sieht nichts und sendet mir die Daten nicht.Read SerialDataPort viele Male

public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
    { 
     //init serialport comport 
     SerialPort comport = (SerialPort)sender; 

     // Shortened and error checking removed for brevity... 
     int bytes = comport.BytesToRead; 
     string indata = comport.ReadExisting(); 
     byte[] buffer = new byte[bytes]; 
     comport.Read(buffer, 0, bytes); 
     HandleSerialData(buffer, comport); 

    } 

HandleSerialData funktioniert, ist es nicht in meinem Problem egal denke ich, lass ich den Code nur bei.

public void HandleSerialData(byte[] respBuffer, SerialPort comport) 
    { 
     /*StringBuilder hex = new StringBuilder(respBuffer.Length * 2); 
     foreach (byte b in respBuffer) 
      hex.AppendFormat("{0:x2}", b);*/ 

     string hex = ""; 
     int n = 0; 
     byte[] ID_TIC; 
     ID_TIC = new byte[8]; 

     for (int i = 12 ; i < 15; i++) 
     { 
      ID_TIC[n] = respBuffer[i]; 
       n = n++; 
     } 

     hex = hex + BitConverter.ToString(ID_TIC).Replace("-",string.Empty); 

     string hex2 = hex.ToString(); 
     Dispatcher.BeginInvoke((Action)(() => { EnOcean_Label.Content = ID_TIC; })); 
     Dispatcher.BeginInvoke((Action)(() => { EnOcean2_Label.Content = ID_TIC; })); 

     List<User> users = new List<User>(); 
     users.Add(new User() { NumeroTIC = hex2, NumeroCNT1 = hex2, Date = DateTime.Now }); 

     Dispatcher.BeginInvoke((Action)(() => { dgSimple.ItemsSource = users; })); 

     WriteTest(ID_TIC); 


    } 
+0

Wir haben Ihnen bereits gesagt, wie Sie es in Ihrer vorherigen Frage richtig machen, Sie bekommen es immer noch drastisch falsch. Das Aufrufen von ReadExisting() * und * Read() macht überhaupt keinen Sinn, Sie werden nie etwas von Read() bekommen, da ReadExisting den Empfangspuffer bereits geleert hat. Und Sie zählen immer noch keine Bytes, das ist eine schwierige Anforderung, und Sie können den Rückgabewert von Read() nicht ignorieren. Bitten Sie ein Teammitglied, Ihnen zu helfen. –

Antwort

0

Sie sind nicht den Serialport nach dem Senden des Bytes zu öffnen (müssen Sie diesen durch tun):

//Last line of code that sends the hex-code 
System.Threading.Thread.Sleep(500) //Assuming you're starting with an open port 

... und warten auf die Antwort

Oder:

//Last line of code that sends the hex-code 
comPortReadFunction() 

Ihre Lesefunktion sollte keine Parameter haben. Sie brauchen keine Parameter haben, wenn Sie den COM-Port gerade hören

+0

Okay, nach ein paar Tests, passiert es, dass mein serialport nicht verbunden ist (wie es irgendwie comport.close() ist; irgendwo in meinem Code passiert, aber es nicht) nach dem ersten Telegramm –

+0

hast du deinen vollständigen Code nicht angegeben also kann ich dazu nichts sagen. Zeig uns alles. –

-2

Nun, ich weiß, warum ist mein Problem, mein Serialport nicht als statisch definiert ist, und der Garbage Collector es jedes Mal tötet genannt wird

+0

Wo ist die 'WriteTest (ID_TIC)' -Funktion? Der 'Thread.Sleep' sollte nach dieser genauen Zeile sein (wenn es derjenige ist, der den Befehl sendet) –

Verwandte Themen