我有一个系统,我从一个X,Y,Z运动阶段读取串口,这意味着我发送一个信号(通过usb)到一个功能,读取信号,相应地移动步进电机,然后读取下一个步进电机信号等等。目前,这个函数如下所示:
 public void SCPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                string sCurString = "";
                //Loop to receive the data from serial port
                System.Threading.Thread.Sleep(150);
                sCurString = SCPort.ReadExisting();
                if (sCurString != "")
                    StrReceiver = sCurString;
                if (BlnSet == true)
                {
                    if (StrReceiver.Length == 3)
                    {
                        if (StrReceiver.Substring(StrReceiver.Length - 3) == "OK\n")
                            BlnReadCom = true;
                    }
                    else if (StrReceiver.Length == 4)
                    {
                        if (StrReceiver.Substring(StrReceiver.Length - 3) == "OK\n" || StrReceiver.Substring(StrReceiver.Length - 4) == "OK\nS")
                            BlnReadCom = true;
                    }
                    else
                    {
                        if (StrReceiver.Substring(StrReceiver.Length - 3) == "OK\n" || StrReceiver.Substring(StrReceiver.Length - 4) == "OK\nS" ||
                            StrReceiver.Substring(StrReceiver.Length - 5) == "ERR1\n" || StrReceiver.Substring(StrReceiver.Length - 5) == "ERR3\n" ||
                            StrReceiver.Substring(StrReceiver.Length - 5) == "ERR4\n" || StrReceiver.Substring(StrReceiver.Length - 5) == "ERR5\n")
                            BlnReadCom = true;
                    }
                }
                else
                {
                    if (StrReceiver.Substring(StrReceiver.Length - 1, 1) == "\n")
                        BlnReadCom = true;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Failed to receive data", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }此函数读取序列化端口SCPort,由Thread.Sleep指示每150 by读取一次。如果我试图更快地读取数据,我就会得到异常(这很可能表明了我的系统的局限性)。很好。但是,这个异常不是立即抛出的,而是偶尔抛出的。我想要做的不是在读取信号之间等待固定的时间,而是每次等待,直到串行口准备就绪,然后读取它。这将加快我的系统速度,因为与其在每次移动之间等待150 as,我可以完全等待系统所需的时间。
问题是:如何在函数中实现此行为?
我没有尝试自己解决这个问题,因为我真的不知道如何解决这个问题。我很乐意在我的函数中实现这一点,但是至少我需要被指向正确的方向。
发布于 2022-04-05 13:27:24
此函数处理与端口SCPort的连接。
public void ConnectPort(short sPort)
        {
            if (SCPort.IsOpen == true)
            {
                ClosePort();
                buttonConnectStage.Text = "Connect stage";
            }
            else if (SCPort.IsOpen == false)
            {
                SCPort.PortName = comStage.SelectedItem.ToString();           //Set the serial port number
                SCPort.BaudRate = 9600;                                //Set the bit rate
                SCPort.DataBits = 8;                                   //Set the data bits
                SCPort.StopBits = StopBits.One;                        //Set the stop bit
                SCPort.Parity = Parity.None;                           //Set the Parity
                SCPort.ReadBufferSize = 2048;
                SCPort.WriteBufferSize = 1024;
                SCPort.DtrEnable = true;
                SCPort.Handshake = Handshake.None;
                SCPort.ReceivedBytesThreshold = 1;
                SCPort.RtsEnable = false;
                //This delegate should be a trigger event for fetching data asynchronously, it will be triggered when there is data passed from serial port.
                SCPort.DataReceived += new SerialDataReceivedEventHandler(SCPort_DataReceived);     //DataReceivedEvent delegate
                try
                {
                    SCPort.Open();                                     //Open serial port
                    if (SCPort.IsOpen)
                    {
                        StrReceiver = "";
                        BlnBusy = true;
                        BlnSet = false;
                        SendCommand("?R\r");                           //Connect to the controller
                        Delay(250);
                        BlnBusy = false;
                        if (StrReceiver == "?R\rOK\n")
                        {
                            displayValues();
                            BlnConnect = true;                        //Connected successfully  
                            ShrPort = sPort;                          //Setial port number
                            buttonConnectStage.Text = "Disconnect stage";
                            SendCommand("V" + sSpeed.ToString() + "\r");            //Set speed
                        }
                        else
                        {
                            BlnBusy = false;
                            BlnConnect = false;
                            buttonConnectStage.Text = "Failed to connect";
                            MessageBox.Show("Failed to connect", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            return;
                        }
                    }
                }
                catch (Exception ex)
                {
                }
            }
        }https://stackoverflow.com/questions/71747550
复制相似问题