C#无法从应用程序启动成功打开串口

时间:2016-11-29 20:15:39

标签: c# winforms serial-port settings

所以我打开了这个端口,并在我的应用程序设置中保存端口名称。当我加载表单时,它尝试打开端口但是没有这样做。只有在单击具有 EXACT 相同代码的“打开端口”按钮后,该端口才会打开。然后,如果我单击我的“关闭端口”按钮并重新打开它的工作表单!它会自动为我打开端口。然而,只有我足够快。如果我将应用程序关闭(并因此关闭端口)10-15秒并重新打开应用程序,我将向我发出错误。这是什么原因??

启动时和我的“开放端口”按钮中使用的代码:

        mySerialPort.createPort(Properties.Settings.Default.portName);

        if (!mySerialPort.isOpen)
        {
            try
            {
                mySerialPort.openSerialPort();
            }
            catch
            {
                MessageBox.Show("Error: Could not open Serial port " + Properties.Settings.Default.portName, "Port Opening Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            if (mySerialPort.isOpen)
            {
                portActiveStatusLbl.Text = Properties.Settings.Default.portName + " OPEN";
                portActiveStatusLbl.ForeColor = Color.Green;
            }
        }

这里是mySerialPort类:

    public static class SerialPortConfig
{
    public static SerialPort mySerialPort = new SerialPort();
    public static string myString = "";
    public static bool isOpen { get { return mySerialPort.IsOpen; } }


    public static void createPort (string portName)
    {
        if (portName == "")
            portName = "COM1";
        mySerialPort.PortName = portName;
        mySerialPort.BaudRate = 2400; //Depending on the hardware used this may change, mitutoyo input tool asks for 2400 baud
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.RequestToSend; //DO NOT SET TO NONE

        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    }

    public static void openSerialPort()
    {
        mySerialPort.Open();
    }

    public static void closeSerialPort()
    {
        mySerialPort.Close();
    }

    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting(); //stores the char that fired the event into 'indata'
        myString += indata;
        if (indata.Contains("\r")) //check to see if char received indicates end of measurement
        {
            if (myString == "911\r") //911 is the code given when the micrometer is off, so we have it do nothing
                myString = "";
            else
            {
                myString = myString.Substring(4, 8);
                Form1.instance.pendingMeasurement = true;
            }
        }
    }
}

0 个答案:

没有答案