我在类中声明了Private WithEvents port As New SerialPort("COM1")对象,此对象port的事件(系统自动生成)port_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles port.DataReceived 不知为何总不能激发。
可是声明Private WithEvents port As New SerialPort("COM1")对象在窗口中,就一切正常,接收数据事件正常,为什么?
vb中激发事件好象有个.raiseevent吧,是否和这个有关???
还有若是有懂串口SerialPort类的,偶真心请教,为什么我port.read(),port.readline()什么数据都读不到直到超时???只能在接收事件中才收得到数据??真不懂怎么搞的??正解另开贴赠分100!!!

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;namespace HelloPDACom
    {
    delegate void MessageReceived(char[] data, string title);
    public partial class Form1 : Form
    {
    MessageReceived mr;
    public Form1()
    {
    InitializeComponent();
    this.mr = new MessageReceived(this.ReadData);
    } private void button1_Click(object sender, EventArgs e)
    {
    if (this.serialPort1.IsOpen)
    {
    this.serialPort1.Close();
    }
    Application.Exit();
    } private void Open_Click(object sender, EventArgs e)
    {
    if (!this.serialPort1.IsOpen)
    {
    this.serialPort1.Open();
    this.Text = "SerialPort Opened";
    }
    } private void Close_Click(object sender, EventArgs e)
    {
    if (this.serialPort1.IsOpen)
    {
    this.serialPort1.Close();
    this.Text = "SerialPort Closed";
    }
    } private void Send_Click(object sender, EventArgs e)
    {
    if (this.serialPort1.IsOpen)
    {
    this.serialPort1.WriteLine(this.textBoxSend.Text);
    }
    } private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
    char[] data = new char[10];
    this.serialPort1.Read(data, 0, 10);
    this.textBoxGet.Invoke(this.mr, data, "Data Received");
    } private void Read_Click(object sender, EventArgs e)
    {
    if (this.serialPort1.BytesToRead > this.serialPort1.ReceivedBytesThreshold)
    {
    char[] data = new char[10];
    this.serialPort1.Read(data, 0, 10);
    StringBuilder sb = new StringBuilder();
    sb.Append(data);
    this.textBoxGet.Text += sb.ToString();
    }
    } private void ReadData(char[] data, string title)
    {
    StringBuilder sb = new StringBuilder();
    sb.Append(data);
    this.textBoxGet.Text += sb.ToString();
    this.Text = title;
    }
    }
    }this.serialPort1.ReceivedBytesThreshold = 10;
    this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);
      

  2.   

    看来兄弟你是搞过serialPort,感谢教导!
      但是你的serialPort1也是放在 class Form1 : Form中,既放在窗口中的;放在窗口的我没问题,只是我想把serialPort1对象封装在另外一个自己写的类中,可是这个对象serialPort1的事件不能激发,既serialPort1_DataReceived(objectsender,                                 System.IO.Ports.SerialDataReceivedEventArgs e)
    ??
      

  3.   

    this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);
      

  4.   

    我知道为什么了?因为我在类中又封装了port对象的write,但是封装在有返回值的函数中是不行的,因为它不能把返回值传回给事件源,所以port对象的write放在void函数中就行了。