我有这样一个问题,其问题在于设计的思想,我不会:我想实现这么一个功能:
    有3个窗口:窗口1(主窗口,含有SerialPort串口)、窗口2(由主窗口1呼出)、窗口3(由子窗口2呼出)
    然后,窗口1中有一个Timer_Tick在一直调用SerialPort进行通信;
    我想要的结果是:
        当我利用主窗口1中的按钮呼出子窗口2,然后再利用子窗口2中的按钮呼出子窗口3时,此时窗口3要利用串口收发一些数据,这些数据可能比较大量,也比较重要;故要求此时窗口1中的SerialPort串口要给窗口3独占使用,在窗口3使用完之后,再放给主窗口1中的Timer_Tick给其他人使用。我的问题是:怎么实现上面的功能呢?????我尝试了如下办法:
    1)在子窗口3中定义一个for循环,让程序在窗口3中的for循环干完之后,才跳回到主循环;
       发现不行:原因是如果这样就必须调用窗口1中的SerialPort串口,就必须在窗口3中定义Form1 form1=new Form1(); 这样直接导致程序无法启动,因为主窗口1一直在被定义new Form1();    2)把主窗口1中的SerialPort定义为静态串口:static SerialPort,这样就可以不用Form1 form1=new Form1()也可以让子窗口3使用主窗口1中的SerialPort了;
       发现不行:SerialPort定义了static后,子窗口3无法访问form1.Serialport,提示为“无法使用实例引用来访问成员”    3)把主窗口1中的Timer_Tick停止掉,来执行子窗口3中的串口通讯程序(当然这时要将这些程序放到主窗口1下)
       发现不行:当把主窗口1中的Timer_Tick停止掉后,程序单步调试走到子窗口2显示完毕(此时子窗口3因由窗口2呼出故也显示完毕了)后,程序便永远停止了,回不到主窗口1中Timer_Tick停止的地方。
我想了很久,到底怎么样的一种思想可以实现我上面说的功能呢?????诚恳请高手指教!!!!

解决方案 »

  1.   

    SerialPort只能打开一串口,你需要让其他窗体用时,先关闭当前使用的,否则会出错
      

  2.   

    首先我认为最重要的是你只是要数据共享而并且是共享SerialPort控件故SerialPort控件你放在主窗体下没有问题,重要的是你需要把主窗体的SerialPort控件的数据传给其它窗体。所以我认为应该把每次接收到的数据放在一个list里,把你的list共享出去(或list声明为静态的)。
    其它窗体只需调用你的list注:在每次数据list后,都必须手工清理你的list使用过的数据。
      

  3.   

    1.将SerialPort传递给窗口3中的属性
    2.静态变量SerialPort
      

  4.   

    确实是高手如云 其实我想优先用串口独占的方法来实现,实在不行就用SerialPort传值的方法;可是高手们你们说的我看不懂啊???“SerialPort只能打开一串口,你需要让其他窗体用时,先关闭当前使用的,否则会出错 ”“1.将SerialPort传递给窗口3中的属性
    2.静态变量SerialPort”有哪位大哥能帮小弟我详细的说下,我实在是看不懂上面的高手的回复
      

  5.   

    没人啊。。敢问什么是“静态串口”啊我定义了public static SerialPort comm = new SerialPort();后在别的窗口了调用 form1.comm,就马上提示“无法使用实例引用来访问成员”到底有没有“静态变量SerialPort"这一说????我最上面的问题,哪位大哥能帮我翻译下上述高手的回复啊,小弟我看不懂啊。
      

  6.   

    在别的窗口了调用 form1.comm,就马上提示“无法使用实例引用来访问成员”这说明你的form1是主窗体的另一个实例对象。
    要访问主窗体下的静态成员,就直接用主窗体的类名称.来访问
      

  7.   

    “在别的窗口了调用 form1.comm,就马上提示“无法使用实例引用来访问成员”这说明你的form1是主窗体的另一个实例对象。
    要访问主窗体下的静态成员,就直接用主窗体的类名称.来访问”什么是窗体的类名称? 
    我百度无结果啊
    请问是什么意思??我现在form1就是主窗口1(SerialPort在其下),需要调用form1下的串口控件的是子窗口3
    主窗口1呼出子窗口2,子窗口2呼出子窗口3能不能请您一次性说的简单点.谢谢了
      

  8.   

    错误提示是:主窗口1定义了public static System.IO.Ports.SerialPort comm = new SerialPort();子窗口3调用: form1.comm.Write(bytesend, 0, bytesend.Length);报错如下:
    无法使用实例化引用来访问成员“Form1.comm”;请改用类型名来限定它
      

  9.   

    你到你的form3里面找是不是有下面的代码
    Form1 form1=new Form1()