当前位置: 代码迷 >> C# >> C# SerialPort串口通信中DataReceived事件不能触发,该如何解决
  详细解决方案

C# SerialPort串口通信中DataReceived事件不能触发,该如何解决

热度:560   发布时间:2016-05-05 05:31:23.0
C# SerialPort串口通信中DataReceived事件不能触发
各位大神,我先描述下我的问题。
在一个自己编写的类(CCeSerialPort)中实例化了SerialPort,其他的串口配置什么的都操作了。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Text;

using System.IO.Ports;

namespace test
 {
    public class CCeSerialPort
    {
        // private long received_count = 0;    //接收计数
        //private long send_count = 0;        //发送计数

        //串口通信需要使用的资源
        private List<Byte> buffer = new List<byte>(1024);
        public byte[] binary_data_buffer = null;

        public SerialPort comport1 = new SerialPort();
        //设备编号,实例化该类时必须给该属性初始化
        public String deviceNumber;

        //public event DataReceivedEventHandler DataReceived;

        public CCeSerialPort()
        {
            RS232ComportInit();
            comport1.DataReceived += new SerialDataReceivedEventHandler(comport_DataReceived);
        }

        //串口1的初始化
        public void RS232ComportInit()
        {
            comport1.BaudRate = 9600;
            comport1.DataBits = 8;
            //comport1.StopBits = 0;
            comport1.Parity = System.IO.Ports.Parity.None; 
            comport1.PortName = "COM1";
            //读写超时
              comport1.ReadTimeout = 500;
            comport1.WriteTimeout = 500;
        }
        public void comport_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            // 具体内容就不说了。     
        }

    }
}


然后在需要使用的窗体中对CCeSerialPort进行实例化。

问题来了:
单步执行过程中,我能监测到comport1.DataReceived += new SerialDataReceivedEventHandler(comport_DataReceived);语句正确执行,但是comport_DataReceived方法一直不能执行。
另外,发送数据是很流程的。

整体来说就是接收不到数据,但是发送数据正常。

一共就40分,全部奉上,谢谢大家。
------解决思路----------------------
没见到comport1.Open
------解决思路----------------------
 public CCeSerialPort()
        {
            RS232ComportInit();
            comport1.DataReceived += new SerialDataReceivedEventHandler(comport_DataReceived); //.
            //this.comport1.DataReceived += new SerialDataReceivedEventHandler(comport1_DataReceived);
 
        }
 
        void comport1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //throw new NotImplementedException();
        }
 


 try
            {
                comport1.Open();
            }
            catch (Exception ex)
            {
                comport1 = new SerialPort(); 这里你重新new后没有对事件进行绑定呀
                System.Windows.Forms.MessageBox.Show(ex.Message);
            }

而你的事件是在构构函数里实现绑定的。。。
------解决思路----------------------
同意8楼的说法,另外你在调用 
comport1.DataReceived += new SerialDataReceivedEventHandler(comport_DataReceived);
的时候,没有看到对应的 
comport1.DataReceived -= new SerialDataReceivedEventHandler(comport_DataReceived);
操作,是不需要吗?同样的我只看到了RS232ComportInit方法,是不是有必要再增加一个RS232ComportDispose方法呢?
 
------解决思路----------------------
是否真的有数据返回?看你这是上位机的通信程序。有能监控串口通信的软件。
------解决思路----------------------
先用程序发送数据,然后用串口调试助手接受数据看下数据是否有返回。针对8楼说的情况单步调试一下看下是否会跑到catch (Exception ex)里去!