当前位置:编程学习 > C#/ASP.NET >>

C#serialport。datareceived事件无法正常触发

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);

        
        }

--------------------编程问答-------------------- 你先看看是否执行到了 Invoke,而且对于都是主进程的同步操作,不需要 Invoke --------------------编程问答-------------------- 不管要不要Invoke,都没有任何反应。,
引用 1 楼 bdmh 的回复:
你先看看是否执行到了 Invoke,而且对于都是主进程的同步操作,不需要 Invoke
--------------------编程问答-------------------- 没有响应是因为没有读完!
试一下!    
  int iLEN=serialPort1.BytesToRead;
            byte[] b_read = new byte[iLEN];
            serialPort1.Read(b_read, 0, iLEN); --------------------编程问答-------------------- 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);

        
        }
--------------------编程问答-------------------- 你先改一下试试!  --------------------编程问答-------------------- 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进制字符串   
                
             }));
按照您说的我把代码加了进去没有反应
引用 3 楼 qkhqkhqkh 的回复:
没有响应是因为没有读完!
试一下!    
  int iLEN=serialPort1.BytesToRead;
            byte[] b_read = new byte[iLEN];
            serialPort1.Read(b_read, 0, iLEN);
--------------------编程问答-------------------- 1、把电脑的串口2,3针短接,用串口调试助手能收到正确的数据。
2、用示波器查看2针波形,能看串口发送的数据。数据用查询的方法能读到,但是无法触发datareceived事件 --------------------编程问答--------------------     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");
)); --------------------编程问答-------------------- 不知道楼主解决了没有,我今天碰到了这个问题,我在串口初始化时设置SerialPort.DtrEnable = true;就ok了。原因是大部分下位机的串口同上位机通信时,上位机不需要这样设置,我们很难注意 到这个问题。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,