串口接收数据
        //串口开发发送数据(每点击一次发送一次数据)
        private void tsbStartTest_Click(object sender, EventArgs e)
        {
                string sortNumber = "COM" + UserInfomation.SerElementPort;//获得配置端口号
                if (serialPort.IsOpen == false)
                {
                    serialPort.PortName = sortNumber;//设置通信端口
                    serialPort.StopBits = StopBits.One;//停止位
                    serialPort.DtrEnable = true;
                    serialPort.BaudRate = 19200; //波特率
                    serialPort.Open();
                }
                tsbStartTest.Enabled = false;
                Closings = false;//不是正在关闭中
//*****************************                 //对Com口监听实例委托
                updateText = new UpdateTextEventHandler(UpdateTextBox);
                //声明开始接收端口的事件
                serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPortMailk_DataReceived);
//*****************************
                bool isResult = SerialPortInfo.Run(serialPort, 0);
                if (isResult == false)
                {
                    MessageBox.Show("发送指令失败");
                }
        }      在//*****************************之间包含的这段代码如果放在Load方法里面和放在这个地方作用是一样的吗?有什么不同?

解决方案 »

  1.   

    应该放在Load方法里面,或serialPort.Open()语句之前
      

  2.   

    就你贴的代码看来,效果是一样的。
    serialPort.DataReceived += ... 是订阅事件,它放在何处并无强制要求。但在订阅之前,串口即使接收到数据,也无法引发DataReceived事件
      

  3.   

    之前没有考虑到这种情况。如果订阅了多次,DataReceived事件则会被引发多次。
      

  4.   

    我的数据是在SerialPortInfo.Run(serialPort, 0);发送指令之后才会有数据返回的所以不用考虑是否应在serialPort.Open()语句之前
    按照上面的分析,我能以下理解吗?
    如果我点第一次订阅了一次,当引发该事件DataReceived,处理一次接收到的数据
    如果我点第二次有订阅了一次,当引发该事件DataReceived的时候是否是处理两次接收到的数据?
    一次类推,是这样的吗?
      

  5.   

    很明显,多次接收事件,不过处理应该没问题,因为串口读取数据后就清除了,第二次读不到数据,主要有判断也没什么大问题,不过最好放到Page_Load事件了,只订阅一次。
      

  6.   

    不错。
    因此订阅不要放在此处。避免DataReceived被调用多次,同时也避免其它的隐患。这点对于使用事件来说也算是一个比较普遍的原则了
      

  7.   

    帮我分析下下面这个帖子,是不是应为这个原因造成的。在点第一次后,点关闭按钮关闭串口没问题,然后再点(两次或两次以上)就有可能出现问题,串口不能关闭,谢谢。
    http://topic.csdn.net/u/20120203/16/16996fd5-97e7-4212-9d15-fcff08f8e2e3.html
      

  8.   

    能说明白点吗,是说的http://topic.csdn.net/u/20120203/16/16996fd5-97e7-4212-9d15-fcff08f8e2e3.html这个贴子嘛?