使用线程控制串行端口



>串行端口连接到应连续发射字节的设备。速度设置为波特率 9600,数据位为 8

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

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

 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.你假设你总是有两个字符。我想你知道这一点,你控制了来源。
2.当你切断线程(中止(时,你没有照顾收据的实际情况:也许你此时只有一个字符。3.同样的事情:你的代码运行一次。如果什么都没有怎么办?你多久才能回来?您可以松散输入。

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

最新更新