Добавление обработчика событий в main () для SerialPort - PullRequest
5 голосов
/ 25 января 2012

Я пытаюсь подписать обработчик событий на событие полученных данных.Похоже, я не могу указать имя функции обработчика событий.Я не понимаю, почему
myComPort.DataReceived + = new SerialDataReceivedEventHandler (comPort_DataReceived);дает мне сообщение об ошибке.Вот проблема, надеюсь, кто-нибудь может ответить на нее.

занятый кот http://img827.imageshack.us/img827/5904/20120125102247.png

занятый кот http://img444.imageshack.us/img444/3855/20120125102202.png

namespace serialport
{
    public class Program
    {

        internal List<Byte> portBuffer = new List<Byte>(1024);

        static void Main()
        {


            //1. find available COM port
            string[] nameArray = null;
            string myComPortName = 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.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
            myComPort.PortName = myComPortName;
            //the default paramit are 9600,no parity,one stop bit, and no flow control



            //3.open the port
            try
            {
                myComPort.Open();
            }
            catch (UnauthorizedAccessException ex)
            {
                MessageBox.Show(ex.Message);
            }
            //Add timeout, p161

            //reading Bytes
            byte[] byteBuffer = new byte[10];
            Int32 count;
            Int32 numberOfReceivedBytes;
            myComPort.Read(byteBuffer, 0, 9);
            for (count = 0; count <= 3; count++)
            {
                Console.WriteLine(byteBuffer[count].ToString());
            }


        }
        //The event handler should be static??
        void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int numberOfBytesToRead;
            numberOfBytesToRead = myComPort.BytesToRead;
            byte[] newReceivedData = new byte[numberOfBytesToRead];
            myComPort.Read(newReceivedData, 0, numberOfBytesToRead);
            portBuffer.AddRange(newReceivedData);
            ProcessData();
        }
        private void ProcessData()
        {
            //when 8 bytes have arrived, display then and remove them from the buffer
            int count;
            int numberOfBytesToRead = 8;

            if (portBuffer.Count >= numberOfBytesToRead)
            {
                for (count = 0; count < numberOfBytesToRead; count++)
                {
                    Console.WriteLine((char)(portBuffer[count]));
                }
                portBuffer.RemoveRange(0, numberOfBytesToRead);
            }
        }

    }

    }

Ответы [ 3 ]

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

Во-первых, поскольку метод Main является статическим, вы можете вызывать только другие статические методы в том же классе.Так как comPort_DataReceived объявлено как метод экземпляра, следующий код должен исправить назначение обработчика события:

static void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   // ...
}

Секунда, поскольку myComPort определено в Main, ононе быть видимым в comPort_DataReceived.У вас есть два варианта: либо объявить myComPort в качестве статического члена вашего класса, либо использовать аргумент sender обработчика событий:

static void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort port = (SerialPort)sender;
    // ...
}
4 голосов
/ 25 января 2012

В вашем обработчике событий myComPort не находится в области видимости - он объявлен локально в вашем методе main ().Я бы посоветовал вам извлечь обработку com-порта в класс и сделать myComPort переменной-членом этого класса.

Кроме того, ваши комментарии отмечают, что класс SerialPort имеет управляемый ресурс, который необходимо утилизировать с помощьюIDisposable / Using pattern, но у вас нет блока using, обертывающего доступ к порту связи.

Наконец, метод, который вы добавляете в качестве обработчика событий, существует как элемент экземпляра, а не как статический член;чтобы получить к нему доступ из статической области видимости метода main (), вам нужно либо извлечь его из экземпляра класса, либо сделать метод статическим.

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

Ответ Tetsujin no Oni - идеальный способ решить вашу проблему с помощью объема. Другой подход, который также работает, состоит в том, чтобы объявить myComPort статическим членом вашей Программы, например:

.
internal List<Byte> portBuffer = new List<Byte>(1024);
private SerialPort myComPort = new SerialPort();

Затем просто удалите объявление myComPort из вашего main метода.

...