小弟在这向各位大侠求救:  我的问题是:公司有人编了个通过MOXA多串口卡向外部设备传输数据的程序,在使用过程中出现的问题是这个程序无规律地死掉。并且死掉以后用任务管理器都无法将其关闭。要解决问题只能重启电脑,但重启后说不定什么时候又会死掉。  一些现象:1、如果不重启电脑,在打开这个串口通讯程序会提示,串口被占用。
            2、设备接收到的数据保持不变,体现为外部设备一直保持某个动作(程序死时的状态)。
            3、没有规律性,有时重启后没过多久又死掉。有时会好点。系统构成:1、信息流:主机电脑--->MOXA多串口卡---->数据接收设备
          2、MOXA卡插在主机里面,为232信号输出,再通过485传到接收设备程序相关:1、波特率为57600
          2、只发送不接收设备传回的数据

解决方案 »

  1.   

    补充:
    1、程序以前用的波特率是19200 没有问题,现在出现了这个问题。但是降低波特率会带来很多问题,非常麻烦。希望有解决方法。
    2、查过相关资料。说关闭MOXA卡的软件流控制功能能解决,但用MOXA技术支持提供的工具查看MOXA卡时,该功能默认是关闭的。
      

  2.   

    1. 到MOXA网站上,看看有无更新版的驱动;
    2. 看看你同事编写的程序,注意同步,添加锁控制(EnterCritivalSection);检查内存占用,有无一直不断的增长;检查内存泄露(如果逻辑简单,内存使用明确,就首先在静态中确定,不要动态创建);
    3. 提高使用MOXA库那个线程的优先级;
    4. 关闭一些常用的杀毒软件,关闭一些不必要的线程,如数据库服务、http服务等等;
    5. 完成上述后,从一个一个口的增加进来,开始做压力负载测试,直到出现问题为之。
      

  3.   

    大家认为会是什么原因呢?因为现场有很多变频器,当初查完资料后觉得肯能是干扰使得多串口卡进入流控等待模式,所以多串口卡一直在等待下位接收设备返回XOFF类空闲命令,以导致程序不能关闭(因为串口一直在等待)。后来用查看工具说流控默认是关闭的。
      

  4.   

    你应该设置相关流控, 比如timeout的设置, 每个字符的最大超时, 和总共的超时都设置下, 设置小点 .
      

  5.   

    谢谢,muzizongheng和learnhard的建议,可惜程序不是我编的,我这没有源程序。回复Veron_04:不是整个界面都停顿,只是串口程序死掉了,其他一切正常。只是这个程序用任务管理器都关不掉,如果再打开这个程序会提示“××串口被占用”(这个程序所使用的串口)。从接收设备的现象来看,应该是没有继续传送数据(只发不收),体现为外部设备一直保持某个动作(程序死时的状态)。因为接收设备的输出有缓存,所以没有新的数据的话就一直保持原来的数据(也就是程序死之前最后想设备发送的、设备接收到的最后一个数据)。 
      

  6.   


    从你的描述,我觉得有可能是MOXA卡的问题?,建议使用串口调试器调试一下,连续发送命令字符串,看看会不会出现故障。或者你换成PC机的串口来试一试这个通信,只需要加一个通信转接头(不贵,几十块钱可以买到)
      

  7.   

      我觉得好象是应用程序一直在跟MOXA卡通讯,但是并没有数据传输,类似于上面说的通讯等待的状态。
    但是应该不是干扰造成的,因为关闭外部一切变频器等(干扰源)输出设备,只留下计算机和下位机接收。运行程序时,出现相同的情况。但是当只开计算机运行程序时,一切正常。大家从VC程序的角度考虑会是什么原因呢?
      

  8.   

    如果不重启电脑,在打开这个串口通讯程序会提示,串口被占用。
    -----说明程序没关掉,更确定说com1的句柄没有关掉!我串口曾经遇到过一直打印0xff的时候,好像是我异常的关闭了下位机,或者是我的波特率,com口设置不对造成的。。有空你可以自己实验一下我也遇到过。
      

  9.   

    我也有,类似的问题,不过不是普遍现象,就是当先关闭上位电脑的时候,所有串口所带的设备均全速工作。最近又发现,会出现"0XXXXXXXXX"指令引用的""0X00000000内存,不能为读或者写的问题,以及应用程序错误,需要发送错误报告。不知是否有影响
      

  10.   

    这个问题我很清楚,我写的串口大师有时候就有这毛病,这是因为MOXA给提供的通信库里面,读串口数据的是个线程,我不知道你的多串口卡是PCI的还是USB的,反正如果卡出现点儿问题之后他的软件库里的线程就死掉,这个是任何工具都关不掉的,我的解决方法也是重启电脑,但这种情况仅仅出现在我用USB转232的情况下,用计算机真正的串口是不会死的
      

  11.   


    我用的是PCI的,转四口或八口,都有这个问题。
    以前没有出现过这个问题啊?!我用了一种据说只有System、SMSS.EXE和CSRSS.EXE进程不能杀,其他进程都能杀掉的方法“ntsd -c q -p PID” 去关掉这个死掉的进程,却还是关不掉。再请教jingguang580,那你是怎么解决问题的呢?能否赐教,不胜感激!
      

  12.   

    如果用任务栏管理器都无法关掉, 应该是串口驱动层出现问题了.. 
    这个就麻烦了 可能需要更换其他厂家的多串口卡了..
    不管你的程序如何操作串口都不会出现进程无法关闭的情况, 除非是串口卡驱动程序有BUG.
      

  13.   

    谢谢FLandY1982,谢谢大家,为了大家能够看得更明白,现在就我的问题的一些现象和我的思考总结如下 :   我的问题是:公司有人编了个通过MOXA多串口卡向外部设备传输数据的程序,在使用过程中出现的问题是这个程序无规律地死掉。并且死掉以后用任务管理器都无法将其关闭,甚至是用一种据说只有 System、SMSS.EXE和CSRSS.EXE进程不能杀,其他进程都能杀掉的方法“ntsd -c q -p PID” 去关掉这个死掉的进程,却还是关不掉。要解决问题只能重启电脑,但重启后说不定什么时候又会死掉。 一些现象:1、如果不重启电脑,再打开这个串口通讯程序会提示,串口被占用(我想是软件初始化时,检查串口,发现此串口被占用,而弹出的提示框,因为之前的串口程序未能退出)。 
              2、设备接收到的数据保持不变,体现为外部设备一直保持某个动作(程序死时的状态)。 
              3、没有规律性,有时重启后没过多久又死掉。有时会好点。 
              4、只是程序的进程不能退出,程序窗口可以关闭(销毁)。 
              5、在程序的运行过程中,CPU和内存占用正常,程序死后,也正常。 
              6、出现"0XXXXXXXXX"指令引用的""0X00000000内存,不能为读或者写。 
              7、应用程序错误,需要发送错误报告。 
              8、当先关闭上位电脑的时候,所有串口所带的设备均全速工作。 
                拔掉某串口与其所带下位机的连线的时候,这个串口所带的设备均全速工作。 
                此不是普遍现象,就一个工程有这种现象。 系统构成:1、信息流:主机电脑--->MOXA多串口卡---->数据接收设备 
              2、MOXA卡插在主机里面,扩展出多个232串口,每个串口均通过一个232转485模块与接收设备连接 
              3、一个串口连接1~3个数据接收设备(下位单片机),即下位单片机是挂接在485总线上的,其他串口同理。 
                其实就是PC与单片机通讯。 
              4、单片机接收完上位机传来的数据,经过处理后,再控制相应的外部设备动作。 程序相关:1、通讯波特率为57600 
              2、PC程序只发送不接收单片机传回的数据,并且单片机也只是接收数据,并不向上位程序发送数据, 
                因此上位机程序(也就是死掉的那个程序)是永远也接收不到下位机发送来的数据的。             在这里,上位控制软件(计算机串口)和单片机(下位机)的数据传输采用的是单工的工作方式。 
              3、单片机程序,接收所有传到本设备的数据。 使用环境:1、工程; 
              2、变频器设备较多,因此有干扰。 
    一些实验和现象: 
    1、是不是波特率有点高了? 
      程序以前用的波特率是19200 没有问题,以前没有这么多下位设备,以前是一个串口带一个单片机(以前的工程都没这个问题,用了有很多年了)。 
    现在已采取降波特率,只降波特率,其他不变。问题还是没解决,不过感觉好点了,死机没以前那么频繁了、厉害了 
    2、排除干扰问题,关闭外部设备,只留下计算机和下位单片机工作。运行程序,出现同样的问题(进程退不出去)。 
    3、关闭外部设备和下位单片机,只留下计算机工作。运行程序,试过多次,好了!没有再出现死机。 
    自己的思考和分析: 
    1、对于现象2的分析: 
      从接收设备的现象来看,应该是MOXA卡没有继续向下位机传送数据,体现为外部设备一直保持某个动作(程序死时的状态)。因为接收设备的输出有缓存,所以没有新的数据的话就一直保持原来的数 据(也就是程序死之前最后想设备发送的、设备接收到的最后一个数据)。     我觉得好象是应用程序一直在跟MOXA卡通讯,但是并没有数据传输,肯能是串口通讯中的硬件和软件流控制由于干扰被启用(干扰信号刚好在某个时候形成了“XON指令的二进制序列”),使MOXA卡 处于通讯等待的状态,一直在等待下位接收设备返回XOFF表示其处于空闲状态的空闲命令。因此程序退不出,但后来用MOXA技术支持提供的工具查看MOXA卡时,软件流控功能默认是关闭的,硬件流控没 有连接,因此此分析不能很好解释这个现象。而且任务管理器都关不掉说明若是我分析的,也不至于任务管理器都关不掉。 
    并且后来关闭变频器的干扰源设备也还是出现死机现象。 
                  
    2、 
    个人觉得应该是PC端VC程序的问题,但通过实验3不开下位机正常,以及现在系统构成和以前的比较来看,又让我觉得可能是VC程序和单片机通讯的时候出问题了,或者是串口一带多造成的(但同一个工 程中,有一带5的程序也没出现过死机问题)。 
    还有如果是VC程序和单片机通讯的时候出问题怎么会造成VC程序退不出,无法解释。(以前的软件没问题,现在是一个串口带多个单片机(下位机),这些下位单片机均接受主机串口发送来的所有数据 )。 
    所以觉得还是VC程序到MOXA卡这一部分的那个环节的问题。 有网友如是说:这个问题我很清楚,我写的串口大师有时候就有这毛病,这是因为MOXA给提供的通信库里面,读串口数据的是个线程,如果卡出现点儿问题之后他的软件库里的线程就死掉,这个是任何 工具都关不掉的,我的解决方法也是重启电脑,但这种情况仅仅出现在我用USB转232的情况下(我的是PCI转232),用计算机真正的串口是不会死的。 3、 
    看串口编程介绍之后,个人怀疑是多线程处理出了问题 请问两个串口程序同时向同一块多串口卡的不同串口端口发送数据,会有问题吗? 
    例如:串口程序1向串口1发送数据; 
          串口程序2向串口2发送数据; 
          他们同时发送,串口1串口2同属于一块多串口卡(即由一块串口卡扩展出来) 这样若处理不好会有问题吗
      

  14.   

    接收口的数据率必须和发送口德数据率要相同,看看程序设置上有无问题
    最简单的检测方式就是把MOX卡的两个口对接起来,相互发送字符串,看是否正常