private SerialPort SpCom = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);//声明串口       public void listen()        {            SpCom.DataReceived += SpCom_DataReceived;//            //SpCom.DataReceived += new SerialDataReceivedEventHandler(received);        }        public void SpCom_DataReceived(object sender, SerialDataReceivedEventArgs e)        {            byte[] rebuffer = new byte[8];            SpCom.Read(rebuffer, 0, rebuffer.Length);                     //因为要访问ui资源,所以需要使用invoke方式同步ui。            this.Invoke((EventHandler)(delegate            {                MessageBox.Show(rebuffer[0].ToString() + "\n" + rebuffer[1].ToString() + "\n" + rebuffer[2].ToString() + "\n" + rebuffer[3].ToString() + "\n" + rebuffer[4].ToString() + "\n" + rebuffer[5].ToString() + "\n" + rebuffer[6].ToString() + "\n" + rebuffer[7].ToString());            }));        }以上程序目的是想在进入.Invoke((EventHandler)以后,通过messagebox。show();看到rebuffer里的数值,但是始终没有能弹出messagebox。 
如下是我的界面;点开始测试进去之后有串口打开的指令; private void button2_Click(object sender, EventArgs e)
        {    byte[]  buffer =new byte[8];            if (SpCom.IsOpen)
            {
            }
            else
            {
                SpCom.Open();
            }
                       SpCom.Write(buffer, 0, 8);        
        }

解决方案 »

  1.   

    你先看看是否执行到了 Invoke,而且对于都是主进程的同步操作,不需要 Invoke
      

  2.   

    不管要不要Invoke,都没有任何反应。,
      

  3.   

    没有响应是因为没有读完!
    试一下!    
      int iLEN=serialPort1.BytesToRead;
                byte[] b_read = new byte[iLEN];
                serialPort1.Read(b_read, 0, iLEN);
      

  4.   

    private SerialPort SpCom = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);//声明串口       public void listen()
            {            
            SpCom.DataReceived += SpCom_DataReceived;
            }
            
    public void SpCom_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {            
             byte[] rebuffer = new byte[8];
             SpCom.Read(rebuffer, 0, rebuffer.Length);//因为要访问ui资源,所以需要使用invoke方式同步ui。            
             this.Invoke((EventHandler)(delegate
                {                
                MessageBox.Show(rebuffer[0].ToString() + "\n" );
                }));
          }
    以上程序目的是想在进入.Invoke((EventHandler)以后,通过messagebox。show();看到rebuffer里的数值,但是始终没有能弹出messagebox。 
    如下是我的界面;点开始测试进去之后有串口打开的指令; private void button2_Click(object sender, EventArgs e)
            {    byte[]  buffer =new byte[8];            if (SpCom.IsOpen)
                {
                }
                else
                {
                    SpCom.Open();
                }
                           SpCom.Write(buffer, 0, 8);        
            }
      

  5.   

    private SerialPort SpCom = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
            public void listen()
            {
                SpCom.DataReceived += SpCom_DataReceived;
                //SpCom.DataReceived += new SerialDataReceivedEventHandler(received);
            }
            public void SpCom_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                int iLEN = SpCom.BytesToRead;
                byte[] b_read = new byte[iLEN];
                SpCom.Read(b_read, 0, iLEN);
                this.Invoke((EventHandler)(delegate
                {
                    
                    MessageBox.Show(b_read[0].ToString() + "\n" + b_read[1].ToString() + "\n" + b_read[2].ToString() + "\n" + b_read[3].ToString() + "\n" + b_read[4].ToString() + "\n" + b_read[5].ToString() + "\n");
                    //依次的拼接出16进制字符串   
                    
                 }));
    按照您说的我把代码加了进去没有反应
      

  6.   

    1、把电脑的串口2,3针短接,用串口调试助手能收到正确的数据。
    2、用示波器查看2针波形,能看串口发送的数据。数据用查询的方法能读到,但是无法触发datareceived事件
      

  7.   

        this.Invoke(new EventHandler( MessageBox.Show(b_read[0].ToString() + "\n" + b_read[1].ToString() + "\n" + b_read[2].ToString() + "\n" + b_read[3].ToString() + "\n" + b_read[4].ToString() + "\n" + b_read[5].ToString() + "\n");
    ));
      

  8.   

    不知道楼主解决了没有,我今天碰到了这个问题,我在串口初始化时设置SerialPort.DtrEnable = true;就ok了。原因是大部分下位机的串口同上位机通信时,上位机不需要这样设置,我们很难注意 到这个问题。