首页 > 解决方案 > 串口连续数据读取

问题描述

我已经使用 WPF 制作了应用程序,我必须实现串行通信。贝娄我有 DataReceived 功能。

主要问题是该函数仅在某些时候触发,是否有人对 WPF 中的 DataReceived 触发器有更好的解决方案?

下面是连接到 ComPort 的连接

  public static void connnect(string recPort)
        {
            System.Windows.Threading.DispatcherTimer MyTimer = null;
            bool error = false;
                String serialpname = recPort;
                ComPort = new SerialPort();
                if (ComPort.IsOpen == false)
                {
                ComPort.PortName = serialpname;
                ComPort.BaudRate = 38400;  
                ComPort.Parity = Parity.None; 
                ComPort.DataBits = 8;
                ComPort.StopBits = StopBits.One;
                ComPort.DataReceived += new SerialDataReceivedEventHandler(OnSerialDataReceived);
                System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
                dispatcherTimer.Tick += dispatcherTimer_Tick;
                dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
                try
                {
                    if (ComPort.IsOpen == false)
                    {
                        //Open Port
                        ComPort.Open();
                        dispatcherTimer.Start();
                    }
                }              
                catch (System.IO.IOException) { error = true; }              
            }
        }

下面是询问端口的定时器

  private static void dispatcherTimer_Tick(object sender, EventArgs e)
        {
            try
            {
                ComPort.Write(eot + "11" + STX + "2170" + ENQ); // get pos 
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }

数据接收事件


public static void OnSerialDataReceived(object sender,
        SerialDataReceivedEventArgs args)
{           
    bool isString = true;
    try
    {
      Thread.Sleep(100);// this solves the problem
        byte[] readBuffer = new byte[ComPort.ReadBufferSize];

        int readLen = ComPort.Read(readBuffer, 0, readBuffer.Length);

        string readStr = string.Empty;
        if (isString)
        {
            readStr = Encoding.Default.GetString(readBuffer, 0, readLen);
            if(readStr.Length > 10)
            {
                if (readStr.StartsWith("\u0002"))
                {
                    Position = (Mid(readStr, 2, 5));
                    Messenger.Default.Send("NewPos");
                }
                else
                {
                    Position = (Mid(readStr, 31, 4));
                    Messenger.Default.Send("NewPos");
                }
              }
        }
        else
        {
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < readLen; i++)
            {
                stringBuilder.Append(readBuffer[i].ToString("X2") + " ");
            }
            readStr = stringBuilder.ToString();
        }
    }
    catch (Exception ex)
    {
        Trace.TraceError(ex.Message);
        Console.WriteLine(ex);
    }
}

标签: c#wpfserial-portcommunication

解决方案


问题解决了,我添加了一个 Thread.Sleep(100); 在 datareceived 函数中。缓冲区没有填满传入的数据,这似乎是原因。谢谢你。


推荐阅读