2017-09-14 3 views
0

J'utilise Visual Studio 2015 et je code avec C#.Récupère les données du port série et utilise l'heure définie dans la date et heure. #

J'ai programmé une horloge sur mon pic32 et envoyé les données de cette horloge sur le port série.

J'essaye d'essayer de mettre une chaîne mydata du port série et le mettre dans Datetime. Mais je reçois des exeptions et je ne sais pas pourquoi.

Ce que je veux sur mon myData est comme ceci: 00: 10: 2300: 10: 2300: 10: 2300: 10: 2300: 10: 2300: 10: 2300: 10: 23

pourrait vous me donnez une tête à ce sujet?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO.Ports; 
using System.Diagnostics; 

namespace klokske 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      if (!mySerialPort.IsOpen) 
      { 
       mySerialPort.Open(); 
       rtRX.Text = "Port Opened"; 
      } 
      else 
       rtRX.Text = "Port busy"; 
     } 

     DateTime dateTime; 

     private void AnalogClock_Load(object sender, System.EventArgs e) 
     { 
      dateTime = DateTime.Parse(myData); 
     } 

       private string myData; 
     private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
       myData = mySerialPort.ReadExisting(); 
       this.Invoke(new EventHandler(displayText)); 
     } 

     private void displayText(object o, EventArgs e) 
     { 
      rtRX.AppendText(myData); 
     } 
    } 
} 
+0

Veuillez fournir un [mcve] (** pas ** tout le code que vous avez) et poser une question ** spécifique **. Actuellement, il est difficile de dire ce que vous demandez réellement. Où est votre problème spécifique? – dymanoid

+0

Peut-être utiliser [DateTime.ParseExact] (https://msdn.microsoft.com/en-us/library/w2sa9yss (v = vs.110) .aspx)? – Fildor

+2

À peu près personne ne comprend comment fonctionne ReadExisting(). Ce qui est étrange, ça a un excellent nom. Il renvoie ce qui est * existant * dans le tampon de réception. Ce qui n'est jamais exactement "00:10:23". Vous obtenez généralement un ou deux caractères, les ports série sont lents. Les compter est requis, toujours mieux fait avec Read(). –

Répondre

0

Comme @Hans mentionné, le Passant ReadExisting() ne retourne ce qui est actuellement dans le tampon de réception. L'événement DataReceived peut tirer au hasard, donc lorsque cet événement est en cours, vous ne pouvez pas avoir tous les personnages que vous recherchez. Vous devez construire une chaîne jusqu'à ce que vous ayez le message entier, vous pouvez ensuite afficher le texte.

char ESC = (char)27; 
char CR = (char)13; 
char LF = (char)10; 
StringBuilder sb = new StringBuilder(); 

//in my case, the data im expected is ended with a Line Feed (LF) 
//so I'll key on LF before I send my message 
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    string Data = serialPort1.ReadExisting(); 

    foreach (char c in Data) 
    { 
     if (c == LF) 
     { 
      sb.Append(c); 

      this.Invoke(new EventHandler(sb.toString())); 
     } 
     else 
     { 
      //else, we append the char to our string that we are building 
      sb.Append(c); 
     } 
    } 
}