Intento suscribir un controlador de eventos al evento de datos recibidos. Parece que no puedo especificar el nombre de la función del manejador de eventos. No entiendo por qué
myComPort.DataReceived + = new SerialDataReceivedEventHandler (comPort_DataReceived); me está dando un mensaje de error. Aquí está el problema, espero que cualquiera pueda responderlo.Adición de controlador de eventos en main() para 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 para enviar el remitente. Algunas refactorizaciones pueden ser mejores, pero el principio de enviar el remitente es enormemente útil para saber si hay algún evento. – Chris
refactorización bastante importante es definitivamente necesario si desea un programa de C# adecuado que siga los principios de OOP. También omití el hecho de que otros métodos y variables de instancia seguirán siendo un problema, traté de mantener la respuesta pedagógica en lugar de solo proporcionar el código que hubiera utilizado yo mismo, por lo que es necesario investigar un poco más;) – madd0
Así declarar un método estático lo hace pertenecer a un tipo más bien a una instancia, ¿verdad? si es así, ¿deberíamos declarar siempre que el controlador de eventos es estático? Supongo que si puse mycomport como miembro de la clase, debería ser visible para todos los métodos, ¿verdad? – fiftyplus