C #, ошибка обработчика событий с последовательным портом - PullRequest
0 голосов
/ 25 января 2012

Я пишу событие получения данных для порта Serial 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, Line: private static SerialDataReceivedEventHandler SerialDataReceivedEventHandler1 = new SerialDataReceivedEventHandler (ComPort.DataReceived);

показывает мне: 1. недопустимое выражение «private» 2. модификатор «static» недопустим для этого термина 3. следует ли мне использовать Comport здесь?или просто DataReceived ... так как его имя функции

Спасибо за ваш ответ.

Ответы [ 5 ]

2 голосов
/ 25 января 2012

private и static недопустимы в рамках метода. Вы можете объявлять статические элементы только на уровне класса, т.е. здесь:

public class Program
{
   private static object _memberField;

   private static void MemberMethod()
   {
     // not here:
     // private static object _insideMethod; // <- will not work
   }
}
1 голос
/ 25 января 2012

не нужна приватная статика, просто перейдите: -

var SerialDataReceivedEventHandler1 =
                   new SerialDataReceivedEventHandler(ComPort.DataReceived);

но если вы хотите, чтобы он был членом класса Program, переместите объявление в: -

   public class Program
        {

       private static SerialDataReceivedEventHandler;

тогда нужно в Main

SerialDataReceivedEventHandler1 =
                       new SerialDataReceivedEventHandler(ComPort.DataReceived);

но, скорее всего, вы действительно хотите начать свой собственный класс, потому что "Программа" на самом деле не лучшее место .... а работать со статическими классами и статическими методами немного грязно

0 голосов
/ 25 января 2012

закрытый квалификатор применяется только для члена (переменные / методы члена) в вашем определении класса. SerialDataReceivedEventHandler - это просто переменная, которая есть внутри метода.

0 голосов
/ 25 января 2012

Эта строка внутри основного метода. Частные и статические разрешены только вне методов.

0 голосов
/ 25 января 2012

private используется для контроля доступности членов типа или самих типов.Он не применим к переменной, являющейся частью метода, поскольку он уже наиболее доступен для самого метода.

Кроме того, модификатор static также недопустим.Он также применяется к членам типа, чтобы указать, является ли этот член осведомленным об экземпляре.

Ваша строка:

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

Должно быть:

SerialDataReceivedEventHandler SerialDataReceivedEventHandler1 =  
               new SerialDataReceivedEventHandler(ComPort.DataReceived);  

ОднакоВо-первых, эта линия кажется совершенно ненужной.Вы можете упростить это до:

myComPort.DataReceived += ComPort.DataReceived;
...