Последовательный порт непрерывного чтения данных - PullRequest
2 голосов
/ 02 февраля 2020

Я сделал и приложение, использующее WPF, и я должен реализовать последовательную связь. Ниже у меня есть функция DataReceived.

Основная проблема в том, что функция срабатывает только иногда, есть ли у кого-нибудь лучшее решение для триггера DataReceived в WPF?

Ниже приведено соединение Connection to 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);
    }
}

1 Ответ

0 голосов
/ 03 февраля 2020

Проблема решена, я добавил Thread.Sleep (100); в функции приема данных. Буфер не был заполнен входящими данными и, кажется, это было причиной. Спасибо.

...