两串口监控程序同时运行,假死!

kevin_scm 2010-12-15 03:50:27
上位机远程监测两个分区的数据,运行两个软件,分别为A与B。
A区使用串口1,2,3 B区使用串口4,5,6,串口处理无冲突。
两个软件同时开启,在不定期的时间内,不定性会有一个监控软件出现假死状态,持续时间十几秒后恢复.软件中就只有串口数据监控,里面还用了两个DOEVENTS,延时用Sleep.
串口操作方式如下:
Public Function ComSetting(ComNo As Integer)
On Error Resume Next
If MSComm_Ageing.CommPort <> ComNo Then
If MSComm_Ageing.PortOpen = True Then
MSComm_Ageing.PortOpen = False
End If
MSComm_Ageing.CommPort = ComNo
MSComm_Ageing.InputMode = comInputModeBinary '串口通信方式为2进制传送
MSComm_Ageing.InputLen = 0
MSComm_Ageing.InBufferSize = 512 '设置输入缓冲区字节数
MSComm_Ageing.InBufferCount = 0
MSComm_Ageing.OutBufferSize = 512 '设置输出缓冲区字节数
MSComm_Ageing.OutBufferCount = 0
MSComm_Ageing.RThreshold = 0 '允许驱动事件字节数
MSComm_Ageing.Settings = "28800,n,8,1"
If (ComNo = 1 Or ComNo = 4) Then
MSComm_Ageing.Settings = "9600,n,8,1"
Else
MSComm_Ageing.Settings = "19200,n,8,1"
End If
MSComm_Ageing.PortOpen = True
End If
End Function

不知道哪位朋友曾遇到过,望看看有何办法解决!
谢谢了!
...全文
464 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevin_scm 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 veron_04 的回复:]
楼主又不上串口通信部分的代码,我们也只能猜测。。。
[/Quote]
有啊····
kevin_scm 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 allanli 的回复:]
在代码中写一些跟踪代码,例如输出日志等,看看是执行那一行代码出现假死
然后再重点找原因吧
[/Quote]
跟踪不到呢,每次都是处于不同的行的代码中。
kevin_scm 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 veron_04 的回复:]
引用 48 楼 myjian 的回复:
引用 46 楼 xutonghuang1986 的回复:
换了串口卡了 还是不行!!!
现把症状总结如下:
1.单独开A区程序(监控串口1、3、4)或B区的程序(串口2、5、6)可以,同时开就会不定时出现未响应。
2.在没有接下位机设备时,同时开,正常运行。
总结:哎,那肯定是串口程序的接收处理有问题了!!!
明天改了再让人家在现场试!!
希……
[/Quote]

谢谢各位,已经解决了。
之前是一个程序只使用一个Mscomm控件,控制4个串口,会产生以上那种问题。
后面,我每一个串口都对应使用一个Mscomm控件,目前应用了十几天,就再也未出现未响应的问题了。
我觉得,是不是因为如果只用一个MSCOMM的话,它控制多个串口,需要频繁地开关(MSCOMM1.portopen = true/false),才导致有时通信时串口关不掉或打不开导致程序假死,当然也有可能是我这方面的代码写得不好导致的,但是我操纵串口的代码就是之前贴出来的那样了。
而每个串口对应使用一个MSCOMM时,则不存在需要频繁地开关了,可以让串口在程序运行过程一直处于ON的状态了,我想,其区别就在于此吧?
虽然解决了,但还是希望大家不吝赐教!
谢谢大家的帮忙。
allanli 2010-12-25
  • 打赏
  • 举报
回复
在代码中写一些跟踪代码,例如输出日志等,看看是执行那一行代码出现假死
然后再重点找原因吧
贝隆 2010-12-23
  • 打赏
  • 举报
回复
楼主又不上串口通信部分的代码,我们也只能猜测。。。
嗷嗷叫的老马 2010-12-23
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 veron_04 的回复:]
使用串口调试器同时打开各个串口发送命令就可以了,不用自己写了。这样如果没有问题,那就是代码的问题(比较我们还是要相信串口调试器的),如果没有问题,那就是硬件的问题。[/Quote]
还是实际数据量来测试比较准确,因为是在实际工作时出的问题.

点引用时居然点到拍砖上去了- -!!
贝隆 2010-12-23
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 myjian 的回复:]
引用 46 楼 xutonghuang1986 的回复:
换了串口卡了 还是不行!!!
现把症状总结如下:
1.单独开A区程序(监控串口1、3、4)或B区的程序(串口2、5、6)可以,同时开就会不定时出现未响应。
2.在没有接下位机设备时,同时开,正常运行。
总结:哎,那肯定是串口程序的接收处理有问题了!!!
明天改了再让人家在现场试!!
希望能成功!
那这样.

写一个EXE……
[/Quote]
使用串口调试器同时打开各个串口发送命令就可以了,不用自己写了。这样如果没有问题,那就是代码的问题(比较我们还是要相信串口调试器的),如果没有问题,那就是硬件的问题。
嗷嗷叫的老马 2010-12-23
  • 打赏
  • 举报
回复
MSCOMM控件内部应该也是有一个线程的.

但是控件事件触发时,处理线程却只有一个,就是你写的代码所运行的线程.

如果这个代码没写好,有可能会有问题,先按我上面的方案,把这个可能性排除了再说.
嗷嗷叫的老马 2010-12-23
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 xutonghuang1986 的回复:]
换了串口卡了 还是不行!!!
现把症状总结如下:
1.单独开A区程序(监控串口1、3、4)或B区的程序(串口2、5、6)可以,同时开就会不定时出现未响应。
2.在没有接下位机设备时,同时开,正常运行。
总结:哎,那肯定是串口程序的接收处理有问题了!!!
明天改了再让人家在现场试!!
希望能成功![/Quote]
那这样.

写一个EXE,只监视一个串口,在界面上选择.

然后把这个EXE运行N份,几个串口就运行几份,分别工作.

如果这样OK,再向下一步.
贝隆 2010-12-22
  • 打赏
  • 举报
回复
能否把你的串口通信程序公布一下?
你换了什么卡?
kevin_scm 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 veron_04 的回复:]
引用 43 楼 xutonghuang1986 的回复:
引用 39 楼 popcorn123 的回复:
我遇到过你说的问题,死机了,但是看CPU却是0%,后来我的解决方法是重新安装系统,然后重新安装串口驱动,后来就一直没出现过了。
我遇到这个问题的时候,用的是gost的系统,后来找了张正版的XP系统安装,然后又找了研华的板卡驱动,是找客服要的最新的,之后就好了

跟操作系统也有关系??……
[/Quote]
换了串口卡了 还是不行!!!
现把症状总结如下:
1.单独开A区程序(监控串口1、3、4)或B区的程序(串口2、5、6)可以,同时开就会不定时出现未响应。
2.在没有接下位机设备时,同时开,正常运行。
总结:哎,那肯定是串口程序的接收处理有问题了!!!
明天改了再让人家在现场试!!
希望能成功!
贝隆 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 xutonghuang1986 的回复:]
引用 39 楼 popcorn123 的回复:
我遇到过你说的问题,死机了,但是看CPU却是0%,后来我的解决方法是重新安装系统,然后重新安装串口驱动,后来就一直没出现过了。
我遇到这个问题的时候,用的是gost的系统,后来找了张正版的XP系统安装,然后又找了研华的板卡驱动,是找客服要的最新的,之后就好了

跟操作系统也有关系??
我用的也是GHOST!
明天试试。
[/Quote]
有些卡是重新安装了驱动就又可以使用了,但问题的关键可能还是在卡上。硬件的原因导致通信卡老是出现驱动不行。我曾经就有如此经历,使用的Sunix8159老是在使用一段时间时出现卡找不到的故障,重新安装一下驱动又好了,但过不了多久旧病复发,直到换了品牌的卡才OK。
贝隆 2010-12-20
  • 打赏
  • 举报
回复
我支持老马的意见,我觉得卡的问题可能性很大,从电气角度去考虑,品质没有保证的卡是会出现抗干扰能力低下等问题的。值得你多多重视。
有一个最简单的办法可以排除掉软件的可能,就是你使用串口调试器把你程序的所有串口都打开,定时自动发送你程序中需要发送的命令,看看是否出现死机的状况。
kevin_scm 2010-12-19
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 popcorn123 的回复:]
我遇到过你说的问题,死机了,但是看CPU却是0%,后来我的解决方法是重新安装系统,然后重新安装串口驱动,后来就一直没出现过了。
我遇到这个问题的时候,用的是gost的系统,后来找了张正版的XP系统安装,然后又找了研华的板卡驱动,是找客服要的最新的,之后就好了
[/Quote]
跟操作系统也有关系??
我用的也是GHOST!
明天试试。
kevin_scm 2010-12-19
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 cbm666 的回复:]
我碰过 "假死" 的状态, 唯一的原因就是你的接收代码 "可能" 有问题,建议你从代码的方向去找问题.
[/Quote]
那您的接收代码出问题是什么类型的问题呢?
我觉得是跟串口有关系的。
因为如果是程序问题的话,我在没有带设备的平台测试是正常的。
我的接收代码都是上面那样Rs232 = MSComm_Ageing.Input
就对RS232这数组里的数组进行转换一下数据而已。
然后保存在文本文档里。(就算不带设备,数据也有保存)
我发现我这张串口卡的的两个com的IRQ是一样的,是不是PCI的中断机制与ISA是有所不同的?
ISA是硬件中断,PCI是分时处理的吗?
newnazi 2010-12-18
  • 打赏
  • 举报
回复
延时 Sleep 用的太多会假死的
嗷嗷叫的老马 2010-12-18
  • 打赏
  • 举报
回复
串口对外是RS232电平,高电平是12V,因此在对外传输时电压幅值比较高,抗干扰性比较不错.

光打开串口,没有数据流,则各条线路都是没有电流的.

传输数据时,才会有发生干扰的可能.

建议你换换卡.

或者不同的串口使用不同的速率试试,并且如上面CBM666所说,不要设置太高的速率,你这卡本身就比较烂
cbm6666 2010-12-18
  • 打赏
  • 举报
回复
我碰过 "假死" 的状态, 唯一的原因就是你的接收代码 "可能" 有问题,建议你从代码的方向去找问题.
popcorn123 2010-12-18
  • 打赏
  • 举报
回复
我遇到过你说的问题,死机了,但是看CPU却是0%,后来我的解决方法是重新安装系统,然后重新安装串口驱动,后来就一直没出现过了。
我遇到这个问题的时候,用的是gost的系统,后来找了张正版的XP系统安装,然后又找了研华的板卡驱动,是找客服要的最新的,之后就好了
kevin_scm 2010-12-18
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 myjian 的回复:]
串口对外是RS232电平,高电平是12V,因此在对外传输时电压幅值比较高,抗干扰性比较不错.

光打开串口,没有数据流,则各条线路都是没有电流的.

传输数据时,才会有发生干扰的可能.

建议你换换卡.

或者不同的串口使用不同的速率试试,并且如上面CBM666所说,不要设置太高的速率,你这卡本身就比较烂
[/Quote]

OK 卡应该快到了
加载更多回复(35)

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧