请教下各位大佬,在方法A中,我绑定了port.DataReceived事件,触发事件后我获取到了串口通信的值并转化为 string a,我想在方法A中将a的值当作返回值return要怎么写?大概过程如下,新人对事件委托这些有点搞不清楚,麻烦大佬指点指点public static stringA()
{
            ...........
            port.Open();
            port.DataReceived += Port_DataReceived;
            return a; //此处希望能将a的值传出
}
private static void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
            byte[] portdata = new byte[10];
            port.Read(portdata, 0, 10);
            a = Encoding.UTF8.GetString(portdata);
 }

解决方案 »

  1.   

            private SerialPort serialport = new SerialPort();
            private StringBuilder builder = new StringBuilder();
           // private StringBuilder bs = new StringBuilder();//用于存储一条完整信息;
            Boolean ope = false;
     
            public Form1()
            {
                InitializeComponent();
                Control.CheckForIllegalCrossThreadCalls = false;
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                string[] names = SerialPort.GetPortNames();
                if (names == null)
                {
                    MessageBox.Show("没有可用的串口", "提示");
                }
                else
                {
                    foreach (string str in names)
                    {
                        toolStripComboBox2_Potrs.Items.Add(str);
                    }
                }
                toolStripComboBox1_Rate.Text = "9600";
                toolStripComboBox1_Rate.Items.Add("4800");
                toolStripComboBox1_Rate.Items.Add("9600");
                //添加事件注册
                serialport.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataRecived);
     
     
     
            }
     
            void serialPort_DataRecived(object sender, SerialDataReceivedEventArgs e)
            {
                Thread.Sleep(500);
                builder.Clear();//清除字符串构造器的内容
                string str = "";
                int n = serialport.BytesToRead;//先记录下来,避免丢失
                label3.Text = n.ToString();
                
                byte[] buf = new byte[n];
                serialport.Read(buf, 0, n);//读取缓冲区数据
                
                this.Invoke((EventHandler)(delegate
                {
                    if (checkBox1_Hex.Checked)
                    {
                        foreach (byte b in buf)
                        {
                            builder.Append(b.ToString("X2") + " ");
                            
                        }
                    }
                    else
                    {
                        //直接以ASCII规则输出
                        builder.Append(Encoding.ASCII.GetString(buf));
                      //  bs.Append(Encoding.ASCII.GetString(buf));
     
                    }
                    //追加文本
                    this.textBox1_ReciMes.AppendText(builder.ToString());
                    //create a new thread
                    //;
                    Thread t = new Thread(new ParameterizedThreadStart(Options));
                    Console.WriteLine(builder.ToString());
                    t.Start(builder.ToString());
                }));
                
            }