Tôi cố gắng đăng ký trình xử lý sự kiện cho sự kiện nhận dữ liệu. Có vẻ như tôi không thể chỉ định tên chức năng xử lý sự kiện. Tôi không hiểu tại sao
myComPort.DataReceived + = new SerialDataReceivedEventHandler (comPort_DataReceived); đang cho tôi thông báo lỗi. Đây là vấn đề, hy vọng mọi người có thể trả lời.Thêm trình xử lý sự kiện vào main() cho 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 để truyền người gửi. Một số tái cấu trúc có thể tốt hơn nhưng nguyên tắc đúc người gửi là rất hữu ích để biết về bất kỳ sự kiện sử dụng nào. – Chris
refactoring khá quan trọng là dứt khoát cần thiết nếu bạn muốn có một chương trình C# phù hợp theo nguyên tắc OOP. Tôi cũng bỏ qua thực tế rằng các phương pháp và biến thể hiện khác vẫn sẽ là một vấn đề, tôi cố gắng giữ cho câu trả lời sư phạm thay vì chỉ cung cấp mã mà tôi đã sử dụng bản thân mình, vì vậy cần nghiên cứu thêm một chút;) – madd0
phương thức tĩnh làm cho nó thuộc về một kiểu thay vì một cá thể, đúng không? nếu vậy, chúng ta có nên luôn khai báo trình xử lý sự kiện là tĩnh không? Tôi đoán nếu tôi đặt mycomport như là một thành viên của lớp, sau đó nó sẽ hiển thị cho tất cả các phương pháp, phải không? – fiftyplus