小弟在这向各位大侠求救: 我的问题是:公司有人编了个通过MOXA多串口卡向外部设备传输数据的程序,在使用过程中出现的问题是这个程序无规律地死掉。并且死掉以后用任务管理器都无法将其关闭。要解决问题只能重启电脑,但重启后说不定什么时候又会死掉。 一些现象:1、如果不重启电脑,在打开这个串口通讯程序会提示,串口被占用。
2、设备接收到的数据保持不变,体现为外部设备一直保持某个动作(程序死时的状态)。
3、没有规律性,有时重启后没过多久又死掉。有时会好点。系统构成:1、信息流:主机电脑--->MOXA多串口卡---->数据接收设备
2、MOXA卡插在主机里面,为232信号输出,再通过485传到接收设备程序相关:1、波特率为57600
2、只发送不接收设备传回的数据
2、设备接收到的数据保持不变,体现为外部设备一直保持某个动作(程序死时的状态)。
3、没有规律性,有时重启后没过多久又死掉。有时会好点。系统构成:1、信息流:主机电脑--->MOXA多串口卡---->数据接收设备
2、MOXA卡插在主机里面,为232信号输出,再通过485传到接收设备程序相关:1、波特率为57600
2、只发送不接收设备传回的数据
1、程序以前用的波特率是19200 没有问题,现在出现了这个问题。但是降低波特率会带来很多问题,非常麻烦。希望有解决方法。
2、查过相关资料。说关闭MOXA卡的软件流控制功能能解决,但用MOXA技术支持提供的工具查看MOXA卡时,该功能默认是关闭的。
2. 看看你同事编写的程序,注意同步,添加锁控制(EnterCritivalSection);检查内存占用,有无一直不断的增长;检查内存泄露(如果逻辑简单,内存使用明确,就首先在静态中确定,不要动态创建);
3. 提高使用MOXA库那个线程的优先级;
4. 关闭一些常用的杀毒软件,关闭一些不必要的线程,如数据库服务、http服务等等;
5. 完成上述后,从一个一个口的增加进来,开始做压力负载测试,直到出现问题为之。
从你的描述,我觉得有可能是MOXA卡的问题?,建议使用串口调试器调试一下,连续发送命令字符串,看看会不会出现故障。或者你换成PC机的串口来试一试这个通信,只需要加一个通信转接头(不贵,几十块钱可以买到)
但是应该不是干扰造成的,因为关闭外部一切变频器等(干扰源)输出设备,只留下计算机和下位机接收。运行程序时,出现相同的情况。但是当只开计算机运行程序时,一切正常。大家从VC程序的角度考虑会是什么原因呢?
-----说明程序没关掉,更确定说com1的句柄没有关掉!我串口曾经遇到过一直打印0xff的时候,好像是我异常的关闭了下位机,或者是我的波特率,com口设置不对造成的。。有空你可以自己实验一下我也遇到过。
我用的是PCI的,转四口或八口,都有这个问题。
以前没有出现过这个问题啊?!我用了一种据说只有System、SMSS.EXE和CSRSS.EXE进程不能杀,其他进程都能杀掉的方法“ntsd -c q -p PID” 去关掉这个死掉的进程,却还是关不掉。再请教jingguang580,那你是怎么解决问题的呢?能否赐教,不胜感激!
这个就麻烦了 可能需要更换其他厂家的多串口卡了..
不管你的程序如何操作串口都不会出现进程无法关闭的情况, 除非是串口卡驱动程序有BUG.
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同属于一块多串口卡(即由一块串口卡扩展出来) 这样若处理不好会有问题吗
最简单的检测方式就是把MOX卡的两个口对接起来,相互发送字符串,看是否正常