使用线程来控制串行端口

时间:2017-03-26 11:52:01

标签: c# multithreading serial-port

串行端口连接到应连续拍摄字节的设备。 使用DataBits 8将速度设置为BaudRate 9600

对串口进行一些测试:测试:1°开门,第2次接收数据,第3次接收数据测试 由于串口上的设备无法发布任何内容,我需要一个线程来确保程序不会永远等待。

下面的代码似乎有效,但实际上有时并不总是检测到门......

 bool EsitoTest = false;

    private void rilevaPorta()
    {
        serialPorts = SerialPort.GetPortNames();
        serialPort1.PortName = serialPorts[0];

        Thread mythreadTest = new Thread(() => testPortaSeriale(serialPort1)); // Lambda expression
        mythreadTest.Start();

        Thread th = Thread.CurrentThread;   // thread main
        Thread.Sleep(500);

        if (mythreadTest.IsAlive)
        {
             mythreadTest.Abort();
        }
        mythreadTest.Join();

        if (EsitoTest) if (!comboBoxSeriale.Items.Contains(comPort)) comboBoxSeriale.Items.Add(comPort);
    }

    private void testPortaSeriale(SerialPort sPort)
    {
        int[] buffer = new int[2];

        try
        {
            //  FIRST TEST - OPENING THE DOOR
            sPort.Open(); 
            testPS1 = true;
            serialPort1.DiscardInBuffer();

            //  SECOND TEST  - RECEIVING DATA
            int i = 0;
            while (i < 2)
            {
                try
                {
                     while (sPort.BytesToRead < 1) ; // attendi finchè non c'è il nuovo dato
                     buffer[i] = sPort.ReadByte();
                     i++;
                }
                catch (Exception ex)
                {
                     EsitoTest = false;
                }
                if (i == 2)
                {
                     testPS2 = true;

                    //  THIRD TEST (OPZIONAL)  - CONTROL VALUE DATA
                    if ((buffer[0] >= 0) & (buffer[0] <= 255) & (buffer[1] >= 0) & (buffer[1] <= 255))
                    {
                         testPS3 = true;
                         EsitoTest = true;
                    }
                    else
                    {
                         EsitoTest = false;
                    }

               }
           }

        }
        catch (Exception ex)
        {
             EsitoTest = false;
        }
        finally
        {
             sPort.Close();
        }
    }

1 个答案:

答案 0 :(得分:0)

首先阅读一些弱点:
你认为你总是有两个字符。我想你知道这一点,你控制了源头 2.当你剪掉线程(中止)时,你不会照顾收据的实际情况:也许你此时只收到一个字符。 3.同样的事情:你的代码运行一次。什么都没有?你回来多久了?你可以放弃输入。

您可能最好让线程永远运行并使用某种通知。

H个