用VS.Net 2005的SerialPort类写了一个程序,别的都处理好了,但是在单片机关闭时,也就是没有数据通讯了,软件没有任何反映。也就是如果向串口写数据,如果下位机没有打开,或无法通讯,那么根本就不触发DataReceived事件。但为了给用户一个提示,如何判断下位机的数据中断?

解决方案 »

  1.   

    Open时候是不会失败的!
    可以用多试几次,每次都超时,就说明无法通讯.
      

  2.   

    lzyuqiang(Pappas)
    我也想到你这种方法,但怎么判断是否超时?
      

  3.   

    在SerialPort类中应该有一属性的,你自己找一下,这种控件我以前用的是VB的,C#中的好象是在2005后才有的,我还没有仔细看过C#中的这个控件.
      

  4.   

    是有个ReadTimeOut属性,好像可以抛出IOException异常,但不知道怎么用啊
      

  5.   

    那不就好说了嘛
    catch(IOException e)
    {
        //计数
       //计数次数到,中断,否则再通讯一次
    }
    //记住在通讯成功后,把计数置零.
      

  6.   

    关键是没有触发这个异常啊,我试了,在ErrorReceived里也没有触发,真郁闷
      

  7.   

    http://www.shengfang.org/blog/p/vsnet2005SerialPort.php
      

  8.   

    http://msdn2.microsoft.com/zh-CN/library/system.timeoutexception.aspx
      

  9.   

    我读可以调用异常了,可是writeTimeout死也不出异常,那个微软说的例子也没个影,真郁闷
      

  10.   

    我以前做类似的程序时,一般都是另外开个线程,往串口去读数据,或者写数据,然后在线程里判断是否超时,超时即kill掉该线程。这样对界面也有好处,否则如果程序死在那里,界面也会死掉的。
      

  11.   

    to pantian(过河老卒)
    这个想法挺好,我也是这样想的,用两个线程,在写的时候也同时读,如果超时了就说明无法通讯了
      

  12.   

    to wuyi8128(六)
    能具体点么?“单片机中每隔一定时间发个同步信号回来”,是要改单片机程序?
      

  13.   

    to wuyi8128(六)
    单片机是够呛能改了,只是我觉得发个命令看返回值就可以。但让我极度郁闷的是,我用的是SerialPort控件,已经用DataReceived来接收数据了。如果我在发时用SerialPort.ReadLine这类读取指令就会异常,提示我DataReceived和ReadLine不是同线程创建。但我这里还不能用多线程,不然分步执行我得到这个结果就没有用了
      

  14.   

    ReadLine不是这么用的啊,你收到一行时置一标志或取得时间就行了。如果收不到自然就不会有收的事件,标志中的时间也不会被改。定时器中的时间与这个进行比较就知道是否超时了。