Как получить данные через последовательный порт в фоновом потоке, в то время как основной поток постоянно получает данные по другому последовательному порту и обновляет winform? - PullRequest
0 голосов
/ 20 марта 2019

Мне нужно поочередно общаться с двумя устройствами через USB для модулей UART и обновить мою winform. Первый работает нормально, но я должен что-то делать не так при получении от второго serialPort. Я удостоверился, что на аппаратной стороне данные передаются и принимаются, но я думаю, что моя программа не запрашивается при получении данных на втором serialPort. Любая помощь приветствуется.

Способ, которым он должен работать, заключается в следующем: при запуске программа начинает непрерывно получать данные от serialPort1 и продолжает обновлять интерфейс пользователя в режиме реального времени. Второй последовательный порт используется только при нажатии кнопки LStart (см. Код второго потока, указанный в теле кода). В этот момент программа должна отправить предопределенную строку и получить ответ. Проблема в том, что эта программа никогда не запрашивает никакого ответа, даже если модуль USB-UART подтверждает получение чего-либо. Постскриптум Я не имею опыта работы с программным обеспечением и не имею значительного опыта работы с c #, так что ожидайте чего-то глупого с моей стороны.

    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;
    using System.IO.Ports;
    using System.Threading;
    using System.Globalization;


    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
    public Form1()
    {
        InitializeComponent();
        if (!serialPort1.IsOpen)

            serialPort1.Open();



        if (!serialPort2.IsOpen)                   
        {
            serialPort2.Open();
            richTextBox1.Text = "Port Opened";
        }                                          
    }

    private void Start_Click(object sender, EventArgs e)
    {
        if (!serialPort1.IsOpen)

            serialPort1.Open();

    }





    private void Read_Click(object sender, EventArgs e)
    {

    }


    private string serialRx = string.Empty;
    private void serialPort1_DataReceived(object sender, 
    SerialDataReceivedEventArgs e)
    {
        serialRx += serialPort1.ReadExisting();                                              
    // Add new data to what we have
        string[] lines = serialRx.Split(new char[] { '$' }, 
    StringSplitOptions.None);        // Each line starts with a $ so, split 
    @ $

        for (int i = 0; i < lines.Length - 1; i++)                                          
    // Not processing the last one yet. It might not be complete yet
        {
            if (lines[i].StartsWith("$ABC"))                                                
    // Checking if its the line we are looking for
            {
                 string[] values = lines[i].Split(new char[] { ',' });                                       
    // Splitting @ "," and after this, do what ever we wanna do with these         
    splitted part(s)

                foreach (var value in values)
                  {

                     Invoke(new Action(() => """dataprocessing1"""

                  }
            }
        }
    }






    **/// <Second Thread Code is below>**

    private void LStart_Click(object sender, EventArgs e)
    {
        var thread = new Thread(StartMeasuring);
        thread.IsBackground = true;
        thread.Start();
        LRFStart.Enabled = false;
    }

    private delegate void DisplayCountDelegate(int i);
    private delegate void EnableButtonDelegate();
    private delegate void ClearBoxDelegate();
    private delegate void WritePort2Delegate();
    private delegate void DisplayReceivedDelegate(string mess);

    private void StartMeasuring()
    {   
        LStart.Invoke(new WritePort2Delegate(WriteonSerial2));     
    }

    private void WriteonSerial2()
    {
        string Actionmeasurement = "ABCDEFDS>";
        serialPort2.Write(Actionmeasurement);
    }

    private void EnableButton()
    {
        LStart.Enabled = true;
    }

    private void ClearBox()
    {
        richTextBox1.Clear();
    }

    private void DisplayReading(string mess)
    {    
        string Reading = mess;
        richTextBox1.AppendText(Reading);
        richTextBox1.Invoke(new ClearBoxDelegate(ClearBox));
        LStart.Invoke(new EnableButtonDelegate(EnableButton));
        Reading = string.Empty;
    }

    private string receivedThisTime = string.Empty;
    private void serialPort2_DataReceived(object sender, 
    SerialDataReceivedEventArgs e)
    {
     receivedThisTime += serialPort2.ReadExisting();
     richTextBox1.Invoke(new DisplayReceivedDelegate(DisplayReading), 
        receivedThisTime);   
       }   
     }
    }

1 Ответ

0 голосов
/ 20 марта 2019

Ну, я никогда не работал с 2 последовательными портами одновременно. Но я думаю, что вам нужно получить некоторую информацию о Threads.

Вы должны создать 2 потока (1 для serialPort1 и еще один для serialPort2).

Вы не можете сделать это только с одним thread.

Содержимое о Threads: Thread.Class

Пример запуска 2 потоков одновременно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...