private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.DtrEnable = false;
            serialPort1.RtsEnable = false;
            serialPort1.close;
            //执行serialPort1.close 时程序档住不动,不在serialPort1_DataReceived中调用串口.close事件,手动点击此按钮不会出现程序档住。
        }        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            string Currentstring="";
            //从串口收到字符串 Currentstring
            //另一台计算机会发送OK字符过来,检测到OK完字符自动关闭串口            if (Currentstring == "OK")
            {
                button1.Invoke(new EventHandler(delegate
                {
                    button1_Click(null, null);
                }));
            }
        }

解决方案 »

  1.   

    private void button1_Click(object sender, EventArgs e) 
            { 
                serialPort1.DtrEnable = false; 
                serialPort1.RtsEnable = false; 
                serialPort1.close; 
                //执行serialPort1.close 时程序档住不动,不在serialPort1_DataReceived中调用串口.close事件,手动点击此按钮不会出现程序档住。 
            } 
    把上面这个函数拆成两个:
    void CloseSerialPort()
    {
     serialPort1.DtrEnable = false; 
                serialPort1.RtsEnable = false; 
                serialPort1.close; }
    void button1_Click(object sender, EventArgs e) 
    {
     CloseSerialPort();下面这个函数也改一下:
    void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
            { 
                string Currentstring=""; 
                //从串口收到字符串 Currentstring 
                //另一台计算机会发送OK字符过来,检测到OK完字符自动关闭串口             if (Currentstring == "OK") 
                { 
                    CloseSerialPort();
                } 
            } }