Próbuję zasubskrybować procedurę obsługi zdarzeń do zdarzenia odebranego. Wygląda na to, że nie mogę podać nazwy funkcji modułu obsługi zdarzeń. Nie rozumiem, dlaczego
myComPort.DataReceived + = new SerialDataReceivedEventHandler (comPort_DataReceived); daje mi komunikat o błędzie. Oto problem, mam nadzieję, że ktoś może na nie odpowiedzieć.Dodawanie obsługi zdarzeń w głównej() dla SerialPort
a busy cat http://img827.imageshack.us/img827/5904/20120125102247.png
a busy cat 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);
}
}
}
}
+1 za odesłanie nadawcy. Niektóre refaktoryzacja może być lepsza, ale zasada rzucania nadawcy jest bardzo przydatna, aby wiedzieć o każdym użyciu zdarzenia. – Chris
dość ważne refaktoryzacja jest definitywnie konieczna, jeśli chcesz mieć odpowiedni program C# zgodny z zasadami OOP. Pominąłem także fakt, że inne metody i zmienne instancji nadal będą stanowić problem, starałem się zachować odpowiedź pedagogiczną zamiast dostarczania kodu, który sam bym użył, więc potrzebne są dalsze badania;) – madd0
Deklaracja metoda static sprawia, że należy do typu raczej do instancji, prawda? jeśli tak, czy zawsze powinniśmy zadeklarować obsługę zdarzeń jako statyczną? Zgaduję, że jeśli umieściłbym mycomport jako członka klasy, powinien on być widoczny dla wszystkich metod, prawda? – fiftyplus