1

シリアルリクエストに大きな問題があります。

私が欲しいものからの説明:

  • シリアル接続を確立し、6 つの温度センサーにシリアル要求を 1 つずつ送信します (これはループで 0.5 秒ごとに行われます)

  • 質問と回答先は List 配列に格納されます

  • すべてのリクエストは個別のスレッドで開始されるため、プログラムがセンサーハードウェアの応答を待機している間、GUI がバグることはありません。

私の問題:

接続と要求は正常に機能していますが、ローカル ハード ドライブでデータを参照している場合、センサー ユニットからの応答が破棄されます (負の代数符号または他のセンサーからの値、または単に間違った値)。これはどのように発生しますか、またはどうすれば解決できますか?

問題は次のとおりだと思います。

  • クラス SerialCommunication のプライベート void ReceiveThread() 内

これが私のコードです:


クラス CommunicationArray:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Hardwarecommunication
{
    public class CommunicationArray
    {
        public string request { get; set; }
        public object myObject { get; set; }
        public string objectType { get; set; }
    }
}

クラス SerialCommunication

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.IO;
using System.IO.Ports;
using System.Windows.Forms;

namespace Hardwarecommunication
{
    class SerialCommunication
    {
        Thread t2;
        Thread t;
        private SerialPort serialPort = new SerialPort("COM2", 115200, Parity.Even, 8, StopBits.One);
        string serialAnswer = "";
        private volatile bool _shouldStop;
        private int counter;

        List<CommunicationArray> ar = new List<CommunicationArray>();

        object[] o = new object[3];


        public void addListener(string request, object myObject, string objectType)
        {
            CommunicationArray sa = new CommunicationArray();

            sa.request = request;
            sa.myObject = myObject;
            sa.objectType = objectType;
            ar.Add(sa);
        }

        public void startListen()
        {
            t2 = new Thread(() => writeSerialPortThread());
            t2.Start();
        }



        public void startSerialPort2()
        {

            try
            {
                serialPort.Open();
                //MessageBox.Show("Connection opend!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }

        public void stopSerialPort2()
        {
            try
            {
                if (serialPort.IsOpen == true)
                    // Connection  closed
                    serialPort.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        private void writeSerialPortThread()
        {
            string request = "";

            for (int i = 0; i < ar.Count(); i++)
            {
                request = ar[i].request;
                //request = ((object[])ar[0])[0].ToString();
                //if (!t.IsAlive)
                //{
                try
                {
                    t = new Thread(ReceiveThread);
                    _shouldStop = false;
                    //MessageBox.Show("start thread");
                    t.Start();
                    serialPort.Write(request);
                    Thread.Sleep(50);
                    _shouldStop = true;
                    t.Join();
                }
                catch
                {
                }
                Label tmpLabelObject = (Label)ar[i].myObject;
                serialAnswer = serialAnswer.Replace("=", "");
                if (tmpLabelObject.InvokeRequired)
                {
                    MethodInvoker UpdateLabel = delegate
                    {
                        tmpLabelObject.Text = serialAnswer;
                    };
                    try
                    {
                        tmpLabelObject.Invoke(UpdateLabel);
                    }
                    catch
                    {
                    }
                }
            }
        }

        private void ReceiveThread()
        {
            //MessageBox.Show("in thread");
            while (!_shouldStop)
            {
                serialAnswer = "";
                try           
                {
                    //MessageBox.Show("in thread");
                    serialAnswer = serialPort.ReadTo("\r");
                    if (serialAnswer != "")
                    {
                    }
                    return;
                }
                catch (TimeoutException) { }
            }
        }
    }
}

Class Form1 //接続を確立し、センサー要求を開始する

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;

namespace Hardwarecommunication
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private SerialCommunication serialCommunication1 = new SerialCommunication();

        private void Form1_Load(object sender, EventArgs e)
        {
            //start up serial connection
            serialCommunication1.startSerialPort2();
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            timerRecord.Enabled = true;
            if (this.buttonStart.Text == "Start")
                this.buttonStart.Text = "Stop";
            else
                this.buttonStart.Text = "Start";            
        }

        private void timerRecord_Tick(object sender, EventArgs e)
        {
            if (this.buttonStart.Text == "Stop")
            {
                this.serialCommunication1.startListen();
            }
        }

        private void buttonFillRequestArray_Click(object sender, EventArgs e)
        {         
            this.serialCommunication1.addListener("$0BR00\r" + "\r", this.labelResult0, "label0"); //request to the hardware
            this.serialCommunication1.addListener("$0BR01\r" + "\r", this.labelResult1, "label1");
            this.serialCommunication1.addListener("$01R00\r" + "\r", this.labelResult2, "label2");
            this.serialCommunication1.addListener("$01R01\r" + "\r", this.labelResult3, "label3");
            this.serialCommunication1.addListener("$01R02\r" + "\r", this.labelResult4, "label4");          
        }
    }
}

問題を解決するためのあらゆる試みに満足しています。ソリューションを .zip としてアップロードすることもできますが、センサー ハードウェアがないため、まったくテストできません。

4

1 に答える 1