从串行端口获取数据并在Datetime c#中使用设置时间

时间:2017-09-14 12:39:27

标签: c# serial-port pic32

我正在使用Visual Studio 2015并使用C#进行编码。

我已经在pic32上编程了一个时钟,并通过串口发送了这个时钟的数据。

我正在尝试从串口输入字符串mydata并将其放入Datetime。但是我得到了解释,不知道为什么。

我的myData上的内容是这样的:00:10:2300:10:2300:10:2300:10:2300:10:2300:10:2300:10:23

你们能否对我这么做?

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

1 个答案:

答案 0 :(得分:0)

正如@Hans Passant所提到的,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);
        }
    }
}