serialport连续实时数据c#

时间:2013-06-01 21:56:10

标签: c# wpf multithreading serial-port real-time

您好我正在尝试编写一个简单的C#WPF,它可以从计时系统实时显示虚拟记分板上的时间信息。我对编程很新,所以深入解释会很感激。

我创建了一个新线程来处理来自COM端口的传入数据,并且在开发应用程序时,将解释此数据。现在我只想将来自计时器的原始信息(以十六进制)显示到文本框中。这可行但不是预期的。我收到大量重复信息,我唯一的解释是我读的数据太慢或者一遍又一遍地读取相同的字节。我想要发生的是取出每个字节并显示它们,所有这些都由一个开始/停止按钮控制。

可能的解决方案包括将整个缓冲区存储在我还不太确定的列表或数组中,我不想添加这么多线程,程序会冻结所有内容。

到目前为止,这是我的代码(我几乎是我在这里编写的所有代码的新手,所以如果有什么不好的做法请告诉我):

public partial class MainWindow : Window
{
    SerialPort comms;
    Thread commThread;

    bool flag;
    string message;


    public MainWindow()
    {
        InitializeComponent();
        comms = new SerialPort();
    }

    private void PortControl_Click(object sender, RoutedEventArgs e)
    {
        if (!comms.IsOpen)
        {
            PortControl.Content = "Stop";
            comms.PortName = "COM1";
            comms.BaudRate = 9600;
            comms.DataBits = 8;
            comms.StopBits = StopBits.One;
            comms.Parity = Parity.Even;
            comms.ReadTimeout = 500;
            comms.ReceivedBytesThreshold = 1;

            commThread = new Thread(new ThreadStart(Handle));

            comms.Open();

            comms.DataReceived += new SerialDataReceivedEventHandler(ReadIn);
        }
        else
        {
            PortControl.Content = "Start";
            flag = false;
            comms.DataReceived -= ReadIn;

            commThread.Join();
            comms.Close();
        }
    }

    private void ReadIn(object sender, SerialDataReceivedEventArgs e)
    {
        if (!commThread.IsAlive)
        {
            flag = true;
            commThread.Start();
        }
    }

      private void Handle()
      {
          while (flag)
          {
              if (comms.IsOpen)
              {
                  try
                  {
                      message = comms.ReadByte().ToString("X2");

                      Dispatcher.BeginInvoke((Action)(() =>
                      {
                          ConsoleBox.Text += message + " ";
                      }));
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show(ex.ToString());
                  }
              }
          }
      }


}

1 个答案:

答案 0 :(得分:0)

这是一个解决方案。

串口在自己的线程中接收数据,你应该读取数据接收处理程序中的传入字节。

我建议读取数据并将其添加到数据接收处理程序中的线程安全FIFO列表中,并从主线程中的列表中读取数据。

在帖子Serial port reading + Threads or something better?

中查看我的解决方案