2017-09-14 26 views
0

Visual Studio 2015를 사용하고 C#을 사용하여 코딩하고 있습니다.직렬 포트에서 데이터 가져 오기 및 날짜 시간 설정 시간 사용 #

나는 내 pic32에 시계를 프로그래밍하고 직렬 포트를 통해이 시계의 데이터를 보냈다.

시리얼 포트에서 문자열 mydata를 넣고 Datetime에 넣으려고합니다. 하지만 나는 압류를 받고 왜 그런지 모릅니다. 00 :

무엇 난 내 MYDATA에 받고 있어요 것은 다음과 같이 2300 : 2300 : 2300 : 10 : 10 10 10 2300 : 2300 : 10 : 10 2300 : 10 23

는 수 너희들이 나 한테 머리를 줘? @Hans 옆모습 언급

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

[mcve] (** 모든 코드 제외)를 입력하고 ** 구체적인 ** 질문을하십시오. 현재, 당신이 실제로 요구하는 것을 말하기는 어렵습니다. 당신의 구체적인 문제는 어디에 있습니까? – dymanoid

+0

아마 [DateTime.ParseExact] (https://msdn.microsoft.com/en-us/library/w2sa9yss(v=vs.110).aspx)를 사용할 수 있습니까? – Fildor

+2

아무도 ReadExisting()이 어떻게 작동하는지 이해하지 못합니다. 이상하게도 훌륭한 이름입니다. 수신 버퍼에 * 존재하는 *을 반환합니다. 결코 정확하게 "00:10:23"에 관한 것입니다. 일반적으로 하나 또는 두 개의 문자가 표시되며 직렬 포트는 느립니다. Read()를 사용하면 항상 효과적입니다. –

답변

0

로서, ReadExisting()는 수신 버퍼에 현재 무엇을 반환합니다. DataReceived 이벤트가 임의로 실행될 수 있으므로이 이벤트가 발생하면 찾고있는 모든 문자가 아직 준비되지 않은 것일 수 있습니다. 전체 메시지가 생길 때까지 문자열을 작성해야 텍스트를 표시 할 수 있습니다.

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