日期:2014-05-18  浏览次数:20976 次

C#编程wince下,在同一个工程下,多个窗口如何实现串口通信?
现在遇到一个问题,在同一个工程下,有多个窗口,如form1,form2,form3,form4,我怎样才能够使得这多个窗口能够同时的得到串口数据,不停的更新界面呢?
我采用的方法是:
  我是在form1里,实现了serialport类,用TextBox1来接受数据,TextBox1属性设定为public,在form2中也有个textbox 来接受form1中TextBox1传来的数据。form2 是通过form1中的button来触发打开的。我现在可以实现的是,当串口数据传来时,form1 中能够及时的更新数据,可是form2中的数据,必须要再次点击button打开form2才可以更新数据。不知道怎么解决这个问题。

还有一个问题,如果采用这种办法来解决多窗口串口问题的话,我在form2中,点击一个button2按钮怎样才能发送数据到串口呢?

大家帮帮忙看看呢,集思广益下,如果不采用这种方法,该如何去做呢?能够给个简单的例子和代码!

------解决方案--------------------
可以加 全局变量 和 全局方法事件,比如在Program类中处理,然后在方法事件中处理串口读写,同时更新form1 form2 form3 form4.
也可以在form1中更新form2 form3 form4,预先传递这3个窗口的引用给form1就行.
------解决方案--------------------
我这里没有wince,也没有串口设备,但form1,form2 form3 form4倒是有的,可以模拟Serialport类的操作

C# code

首先是一个SerialportEx单例类,里面模拟了发送,接收,触发事件等等功能

namespace WindowsFormsApplication1
{
    /// <summary>
    ///  数据到达的委托
    /// </summary>
    /// <param name="text"></param>
    public delegate void DataArrivalHandler(String text);

    /// <summary>
    /// 一个模拟Serialport的单例类
    /// </summary>
    public class SerialportEx
    {
        /// <summary>
        /// 数据到达的事件
        /// </summary>
        public event DataArrivalHandler OnDataArrival;

        /// <summary>
        /// 单例,密封
        /// </summary>
        private SerialportEx()
        {
        }

        /// <summary>
        /// 单例对象
        /// </summary>
        public static readonly SerialportEx Instance = new SerialportEx();

        /// <summary>
        /// 模拟数据到达
        /// </summary>
        /// <param name="text"></param>
        private void DataArrival(String text)
        {
            if (OnDataArrival != null)
            {
                // 触发事件,通知上层
                OnDataArrival(text);
            }
        }

        /// <summary>
        /// 模拟接收数据
        /// </summary>
        public void StartReceive()
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(Send), null);
        }

        /// <summary>
        /// 模拟模拟,全都是模拟
        /// </summary>
        /// <param name="obj"></param>
        private void Send(Object obj)
        {
            while (true)
            {
                DataArrival(System.DateTime.Now.ToString());
                System.Threading.Thread.Sleep(1000);
            }
        }
    }
}

------解决方案--------------------
使用事件和委托