繁体   English   中英

C#,串行端口的事件处理程序错误

[英]C#, event handler error with Serial Port

我正在为串行IO端口编写数据接收事件...以下是代码

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.IO;   //add namespaces
using System.IO.Ports;
     public class Program
        {

            //define a delegate class to handle DataReceived events
            internal delegate void SerialDataReceivedEventHanderDelegate(object sender,SerialDataReceivedEventArgs e);

            internal void DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                //place code to read and process data here
            }

            static void Main()
            {

                string myComPortName=null;
                //1. find available COM port
                string[] nameArray = null;
                nameArray = SerialPort.GetPortNames();
                if(nameArray.GetUpperBound(0)>0) {
                myComPortName = nameArray[0];  
                }
                else {
                    Console.WriteLine("Error");
                    return;
                }    

                //2. create a serialport object
                // the port object is closed automatically by use using()
                SerialPort myComPort = new SerialPort();

                myComPort.PortName = myComPortName; //the default paramit are 9600,no parity,one stop bit, and no flow control

                   private static SerialDataReceivedEventHandler SerialDataReceivedEventHandler1 =
                   new SerialDataReceivedEventHandler(ComPort.DataReceived);

                   myComPort.DataReceived+=SerialDataReceivedEventHandler1;


            }

        }

为什么在VS2010中,行:私有静态SerialDataReceivedEventHandler SerialDataReceivedEventHandler1 = new SerialDataReceivedEventHandler(ComPort.DataReceived);

向我显示:1.无效的表达术语“私人” 2.修饰语“静态”对此术语无效3.我应该在此处使用Comport吗? 或只是DataReceived ...因为它的函数名称

感谢您的回复。

privatestatic在方法范围内无效。 您只能在类级别声明静态项-即在这里:

public class Program
{
   private static object _memberField;

   private static void MemberMethod()
   {
     // not here:
     // private static object _insideMethod; // <- will not work
   }
}

不需要私有静态,只需:-

var SerialDataReceivedEventHandler1 =
                   new SerialDataReceivedEventHandler(ComPort.DataReceived);

但是如果您希望成为Program类的成员,请将声明移至:-

   public class Program
        {

       private static SerialDataReceivedEventHandler;

那你需要在Main

SerialDataReceivedEventHandler1 =
                       new SerialDataReceivedEventHandler(ComPort.DataReceived);

但是更有可能的是,您真的想开始自己的类,因为“程序”并不是真正的最佳选择。...并且处理静态类和静态方法有点混乱

private用于控制类型成员或类型本身的可访问性。 它不适用于作为方法一部分的变量,因为方法本身已经可以最方便地访问它。

此外,静态修饰符也无效。 它也适用于某种类型的成员,以指示该成员是否知道实例。

您的电话:

private static SerialDataReceivedEventHandler SerialDataReceivedEventHandler1 =  
               new SerialDataReceivedEventHandler(ComPort.DataReceived);

应该:

SerialDataReceivedEventHandler SerialDataReceivedEventHandler1 =  
               new SerialDataReceivedEventHandler(ComPort.DataReceived);  

但是,该行似乎完全没有必要。 您可以将其简化为:

myComPort.DataReceived += ComPort.DataReceived;

该行位于main方法内部。 私有和静态仅在方法之外被允许。

private限定词仅适用于您的类定义中的成员(成员变量/方法)。 SerialDataReceivedEventHandler只是方法内部具有的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM