Мне нужно поочередно общаться с двумя устройствами через 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);
}
}
}