我想给SerialPort的Read函数做成事件形式,这样以后掉前来方便
在Cgs08v.cs中
   static class MyError
    {
        public static string msg;
    };
    public class RecvEventArgs : EventArgs
    {
        public  string message;
        public byte[] recvbytes;
        public int recvlen;
        public RecvEventArgs(string message)
        {
           // recvbytes=new byte[1000];
            this.message = message; 
        }
    };
    public delegate void RecvHandler22(object Cgs08v, RecvEventArgs myMEA);
    public class Cgs08v : SerialPort
    {
        public event RecvHandler22 OnRecvData;
        public string  run()
        {
               Thread thread=new Thread(this.ReadSerialPort );
               thread.Start();
               return "";
        }
        public  void ReadSerialPort()
        {
            int readlen=0;
            RecvEventArgs x = new RecvEventArgs("收到消息");
            try
            {
                while (true)
                {
                    readlen = this.Read(x.recvbytes, 0, this.BytesToRead);//我想这个Read函数应该是柱塞的
                    x.recvlen = readlen;
                    OnRecvData(this, x);
                }
            }
            catch (System.Exception ex)
            {
                MyError.msg =ex.Message ; 
            }
            return;
        }        
    };
在Form1.cs中
        Cgs08v sp = new Cgs08v();
        public Form1()
        {
            InitializeComponent();
            sp.OnRecvData += new RecvHandler22(Cgs08v_OnReceive);
            
        }        private void Cgs08v_OnReceive(object sender, RecvEventArgs e) //自定义事件响应函数
        {
            string aa=e.recvbytes.ToString();
            MessageBox.Show(aa);
        }        private void button3_Click(object sender, EventArgs e)
        {
            sp.run();
        }我按了button3,对方已经发过来数据了,但是我这里没显示出来
(另外:SerialPort.Read函数应该是阻塞的把)
我是第一次写c#程序 大家给我指点指点

解决方案 »

  1.   

    注意: 上面的代码是简略过的。COM已经打开 参素都已经弄好,并且可以发送数据。
      

  2.   

    应该不是这样的。你可以自己放一个SerialPort到窗体上面,看看是不是Read就一直停在那里?如果没有数据,Read就没有结果;发生了DataReceive事件之后,Read才能得到数据。
      

  3.   

    你的意思是说 我把他的顺序搞反了?  先有DataReceive事件 然后再Read?
      

  4.   

    是的。DataReceive事件触发之后,你再使用Read就可以读取到数据了,正常情况下,读取串口是没有信息的。