先抱怨一下, 刚写了半天,点击发帖,竟然说我只有给100分的权限, 写了半天的东西, 没了。重来吧初次接触 C#串口通讯和委托,线程问题一委托        delegate void delegatetype(ProgressBar prb);        private void button1_Click(object sender, EventArgs e)
        {
            delegatetype mydele = new delegatetype(DoThings);
            Thread th1 = new Thread(new ParameterizedThreadStart(mydele));
            th1.Start(progressBar1);
                       
        }         void DoThings(ProgressBar prb)
        {
            for (int i = prb.Minimum; i < prb.Maximum; i++)
            {
                prb.Value = i;
            }
        }
如, 上面, 在delegate void delegatetype(ProgressBar prb);是带参数的, 而且Dothings方法也是带参数的
那么 ,像button1事件里的线程那块儿, 我该如何放置这个参数,也就是ProgressBar上面贴的代码,编译不能通过问题二C#Serialport的DataReceived事件触发问题这个更模糊了, 在网上依照例子实现了发送, 我用的虚拟串口, COM2,COM3, com2发送, com3接收目前只能发送, 接收不到奥,好像并没有触发DataReceived事件。另外, 像我这个例子, 是不是在form里放2个Serialport?
写了这么多, 真心希望高人指教 邮箱 [email protected]

解决方案 »

  1.   

    SerialPort spSend; //spSend,spReceive用虚拟串口连接,它们之间可以相互传输数据。spSend发送数据
    SerialPort spReceive; //spReceive接受数据
    TextBox txtSend; //发送区
    TextBox txtReceive; //接受区
    Button btnSend; //数据发送按钮
    delegate void HandleInterfaceUpdateDelegate(string text); //委托,此为重点
    HandleInterfaceUpdateDelegate interfaceUpdateHandle;public void InitClient() //窗体控件已在初始化
    {
      interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox); //实例化委托对象
      spSend.Open(); //SerialPort对象在程序结束前必须关闭,在此说明
      spReceive.DataReceived += Ports.SerialDataReceivedEventHandler(spReceive_DataReceived);
      spReceive.ReceivedBytesThreshold = 1;
      spReceive.Open();
    }public void btnSend_Click(object sender,EventArgs e)
    {
      spSend.WriteLine(txtSend.Text);
    }public void spReceive_DataReceived(object sender,Ports.SerialDataReceivedEventArgs e)
    {
      byte[] readBuffer = new byte[spReceive.ReadBufferSize];
      spReceive.Read(readBuffer, 0, readBuffer.Length);
      this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) });
    }private void UpdateTextBox(string text)
    {
      txtReceive.Text = text;
    }
      

  2.   

    DataReceived 是缓冲区有接收到数据就触发的

    你com2送应该就从com2接受吧?
      

  3.   


    啊, 难道不是一个接收一个发送吗?
    COM2负责接收自己发送的信息吗?能再详细点吗
      

  4.   

    就问题1,没必要弄那么复杂
    new Thread((ThreadStart)delegate
    {
        while(serial.IsOpen)//你的线程循环条件,假设为串口打开
        {
            int min = 0,max = 0;
            this.Invoke((EventHandler)delegate
                {
                    min = ProgressBar1.Minimum;
                    max = ProgressBar1.Maximum;
                });//同步了
            for (int i = min; i < max; i++)
            {
                this.Invoke((EventHandler)delegate{ProgressBar1.Value = i;});
            }
        }
    }).Start();
      

  5.   

    串口通讯看看我博客的例子
    http://blog.csdn.net/wuyazhe/category/695097.aspx
      

  6.   

      public Serial_Port(string port)
            {
                MyPort = new SerialPort(port);
                MyPort.BaudRate = 9600;
                MyPort.DataBits = 8;
                MyPort.ReadTimeout = 5000;
                MyPort.StopBits = System.IO.Ports.StopBits.None;
                MyPort.Parity = System.IO.Ports.Parity.None;
                MyPort.ReceivedBytesThreshold = 15;//引发DataReceived事件的输入缓冲区的字节数
                MyPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);        }
       private void DataReceived(object sender, SerialDataReceivedEventArgs e)
            {            try
                {
                    int n = MyPort.BytesToRead;//读取当前有多少数据可读。
                    byte[] buffer = new byte[n];//新建内容。
                    MyPort.Read(buffer, 0, n);//读取缓冲区
                    Array.Resize(ref byte_return, n);//改写数组大小
                    if (n < 1) { return; }//如果未收到数据则返回
                    //信息长度如果等于15的话。说明接受完了。接受完了就设置receive为真。
                    buffer.CopyTo(byte_return, 0);//复制数据。
                    if (byte_return.Length == 15)
                    {
                        Received = true;
                        return;
                    }
                }
                catch (Exception ex)
                {                throw;
                }        }
      

  7.   


    就是说Serialport是在后台声明的, 并不是form里的控件?
      

  8.   

      public byte[] SendData(byte[] SendValues)
            {
                try
                {
                    Open();//打开端口
                    byte_return = new byte[] { };//重新初始化返回字节数组。
                    Received = false;//设置标识为没有接受到信息
                    MyPort.Write(SendValues, 0, SendValues.Length);//写入串口协议命令。
                    double timespan = DateTime.Now.TimeOfDay.TotalSeconds;//记录下当前总计秒数
                    do
                    {
                        //Application.DoEvents();//释放CPU
                    } while ((Received != true) && (DateTime.Now.TimeOfDay.TotalSeconds - timespan < _timeout));
                    if (Received == false)
                    {
                        Close();
                        return null;
                    }
                    //如果接受到了数据或者已超时就不再循环。
                    Close();
                    return byte_return;
                }
                catch (Exception ex)
                {
                    return null;
                }
            }