多线程串口通信问题请教

yongshengqi 2013-10-30 02:39:54
项目要求:1.有六个串口设备,并有六个测试通道
2.六个通道可对六个设备选择,可能一个通道一台,也可能一个通道六台
3.这六个通关对仪器有不同的控制要求,并要读回数据作处理,要可以同时运行六个通道(六通道动作不同)
开发语言:VB6
OS:WINXP
我的作法:用六个TIMER控件写六个通道下的各种行为,点击指定按键,运行某个TIMER事件,当运行多个TIMER后,发现当后运行的TIMER动作时,先运行的TIMER暂停了
我查了相关资料说是在同一个窗体中同时这样运行六个TIMER是会出现我这样的情况,请问有何解决方法?

我目前了解和确认用MDI窗体作六个子窗体是可以实现要求,但有无方法在一个窗体中实现这样的行为?
...全文
458 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
yongshengqi 2013-11-10
  • 打赏
  • 举报
回复
刚才测试的结果,在不考虑存贮时间,采集间隔和先后顺序的情况下,前天的设想是可行的,现在需要作的就是对各个通道的采集顺序作个程序来处理. 另外请问一下:我打算每个通道满5K条记录就存贮为一个文件,我现在的这个存贮部分是放在单个通道的显示SUB中,不知道对于量测时间上会否产生干扰?或者说这部分可能需要多久时间完成?
yongshengqi 2013-11-09
  • 打赏
  • 举报
回复
引用 39 楼 bakw 的回复:
写个一个单通道的程序,然后运行六个,然后再写一个管理程序,和这六个程序通讯,时间要求高的内容采集程序处理,要求低的管理程序处理。每个程序处理的内容就少了,速度上可以提高些。
这种想法我想到过,但问题这六个通道权限是相同的,要求也是相同的
引用 40 楼 bakw 的回复:
不会每一个设备都有一秒的要求吧? timer时间太短的话doevents很容易触发别的timer,或者你在doevents之前把别的timer关掉,结束之后再开,不知道会不会好些,不过担心有些timer可能会因此不能工作,试过才知道。 看来只用一个timer处理起来比较好些 一进timer之后就把这个timer 关掉 然后就可以放心用doevents了 结束timer之前再把timer打开,像这样子。 Sub Timer1_Timer() Timer1.Enable=False ... ... Doevents ... ... Timer1.Enable=True End Sub
六个通道下还有不同的步骤,当然也有可能是相同的步骤,对于时间的要求自由性很大,有可能是1S采集记录一次,也可以是多秒,这个时间也是由客户定义,并且在通道的步骤中有一个步骤还需要不断的侦测设备的返回值,而这个步骤也是由用户自由设定的可以出现在任何一个通道中 如你所说,我想我的作法将要改为如此: 1、用两个TIMER,一个采集数据,一个运行六通道的程序,同一时间保证只运行一个TIMER; 2、对时间的要求比较高,而且也相对较难处理;对六通道的当前步骤的采集时间进行排序,建立一个序列,顺序采集并保存显示;这一块有一定难度,到时要想想 3、运行六通道的程序作为主程序,用FOR循环顺序判断六个通道是否执行,如果步骤为初期设定,则设定完后跳出到下一个通道,并且设置采集TIMER为TRUE;如果是采集,则收回采集TIMER中采集到的数据, 4、采集TIMER每运行一次在尾部FALSE; 5、假设六个通道都在运行,采集间隔要求为1S,3S,2S,5,6S,那么就需要定义两个变量数组,分别对应当前步骤的起始测试时间,和采集间隔时间,在每一次主程序循环时都判断这个起始时间+间隔时间到了没有如果到了就采集,并对最短的时间量进行延时补偿 今天要在家陪女儿,明天去公司试,笨狗兄再帮我补充补充
yongshengqi 2013-11-09
  • 打赏
  • 举报
回复
引用 35 楼 bakw 的回复:
我原来那个好做些12路采集,但通讯板就一块,读一次就12路一起来的,然后加个时间戳,放在内存里,每五分钟往硬盘上写一次,说是以秒为单位计,其实也不太准,有时候会跳过一秒。
嗯,那是要好作得多,,只要外部采集数据就成,时间的话,只要采集时间在要求范围内,还是能作到秒精度的 我这个真的有点头痛, 我在想这样一个作法:把六个通道分到六个MDI子窗体中,程序运行放在各窗体的按键事件中循环,当然循环会很短的耗时,再加上DOEVENTS画面就不显得死机,同时用一个TIMER来捕捉7台设备的数据提供给六个通道调用,感觉不一定行,但要试,现在在家没法试了
笨狗先飞 2013-11-09
  • 打赏
  • 举报
回复
这样的话Timer的周期要设长一点,最好能在50ms以上,不然可能还是不好处理,反正你一个周期里六个通道都处理一次了,长些应该没关系。
笨狗先飞 2013-11-09
  • 打赏
  • 举报
回复
不会每一个设备都有一秒的要求吧? timer时间太短的话doevents很容易触发别的timer,或者你在doevents之前把别的timer关掉,结束之后再开,不知道会不会好些,不过担心有些timer可能会因此不能工作,试过才知道。 看来只用一个timer处理起来比较好些 一进timer之后就把这个timer 关掉 然后就可以放心用doevents了 结束timer之前再把timer打开,像这样子。 Sub Timer1_Timer() Timer1.Enable=False ... ... Doevents ... ... Timer1.Enable=True End Sub
笨狗先飞 2013-11-09
  • 打赏
  • 举报
回复
写个一个单通道的程序,然后运行六个,然后再写一个管理程序,和这六个程序通讯,时间要求高的内容采集程序处理,要求低的管理程序处理。每个程序处理的内容就少了,速度上可以提高些。
yongshengqi 2013-11-09
  • 打赏
  • 举报
回复
引用 37 楼 bakw 的回复:
六个窗体还不如用六个进程算了
VB6 不知道如何实现六进程呀,之所以用六个MDI子窗体是因为我见过一个几乎相同的程序以MDI子窗体为对象,创建了八个通道来作 顺便请教如何实现六进程
笨狗先飞 2013-11-09
  • 打赏
  • 举报
回复
六个窗体还不如用六个进程算了
笨狗先飞 2013-11-08
  • 打赏
  • 举报
回复
我原来那个好做些12路采集,但通讯板就一块,读一次就12路一起来的,然后加个时间戳,放在内存里,每五分钟往硬盘上写一次,说是以秒为单位计,其实也不太准,有时候会跳过一秒。
yongshengqi 2013-11-08
  • 打赏
  • 举报
回复
每个通道都需要产生报表记录,并且每条记录的时间间隔可能不同,如果在一个SUB中顺序一个个的通道执行下去,产生的报表的时间也就累加了,还是需要隔离;每个通道中的设备执行步骤的时间点也是不同的,有点纠结,继续想:如何实现同步!
yongshengqi 2013-11-08
  • 打赏
  • 举报
回复
欲哭 无泪!!!!!!!!!!!!!!我被需求里的同时六通道测试给害死了!!!!!好简单的程序,给我花了这么久时间和精力改了这么多遍!其实只需要一个TIMER来采集数据就可以了,至于那六个通道实际上是放在一个SUB中来作,根本不可能在一个窗体中用六个TIMER来作,因为六个通道TIMER加两种设备的数据采集TIMER的时间和先后顺序根本无法掌控,杯具,极度杯具了,发现了路,但打击太大,都不太想改了, 最近几年没有写过VB,一直在作LABVIEW,真的忘记太多 思索作为程序员的未来的路.希望有朋友们顺便加入来讨论这个问题
yongshengqi 2013-11-08
  • 打赏
  • 举报
回复
引用 30 楼 bakw 的回复:
貌似没有,没研究过.
没想到在线,哈哈,我试试用变量判断的方法,似乎可行,这个案子搞死我了,时间上不好设置,对方有要求1秒记录一次数据理论上可行,但六通道同时运行跑出来的报表时间不对
笨狗先飞 2013-11-08
  • 打赏
  • 举报
回复
VB是单线程的,一个timer在处理的时候只要不doevents不用担心别的timer来砸场子
笨狗先飞 2013-11-08
  • 打赏
  • 举报
回复
貌似没有,没研究过.
yongshengqi 2013-11-08
  • 打赏
  • 举报
回复
TO:笨狗飞先 请教:多个TIMER同时运行时即其ENABLE都为TURE时执行顺序有无规则?
yongshengqi 2013-11-06
  • 打赏
  • 举报
回复
引用 22 楼 bakw 的回复:
按键检测那里比较恐怖,单片机上才这么干,一般时间占用小的话可以这么处理,对付长按的情况就不好了,具体情况我不了解。 看起来跟发电机复示器比较像, 如果是那种程序的话,先把采集和显示分离开来, 比如你可以用一组mscomm和timer数组,功能就是定时采集数据,然后存到一组变量里边,这样采集程序就完成他的功能了。 然后按钮部分,按钮不管是外部的还是内部的,只对他的触发做处理,就是按下或者放开,按下时标记一个按下的值,放开时标记一个放开的值,不要去紧盯着按钮状态,很消耗资源有按下标记了就认为他按下。 然后是数据加工处理部分,那就要看你需要了,是根据按钮动作来的,还是需要实时处理的,反正处理完的数据就交给显示程序去显示。
在最初的设计中的确是作个标记,然后用TIMER来执行,但会遇到同样的问题,所以就作成这样; 产生的问题也有可能和时间有关
笨狗先飞 2013-11-06
  • 打赏
  • 举报
回复
按键检测那里比较恐怖,单片机上才这么干,一般时间占用小的话可以这么处理,对付长按的情况就不好了,具体情况我不了解。 看起来跟发电机复示器比较像, 如果是那种程序的话,先把采集和显示分离开来, 比如你可以用一组mscomm和timer数组,功能就是定时采集数据,然后存到一组变量里边,这样采集程序就完成他的功能了。 然后按钮部分,按钮不管是外部的还是内部的,只对他的触发做处理,就是按下或者放开,按下时标记一个按下的值,放开时标记一个放开的值,不要去紧盯着按钮状态,很消耗资源有按下标记了就认为他按下。 然后是数据加工处理部分,那就要看你需要了,是根据按钮动作来的,还是需要实时处理的,反正处理完的数据就交给显示程序去显示。
yongshengqi 2013-11-06
  • 打赏
  • 举报
回复
引用 25 楼 bakw 的回复:
timer 10ms 可能太短了,程序处理不过来,一般一次timer响应都在20ms左右,我觉得最好在50ms左右 我一般在timer头上把timer.enable=false,在结束的地方timer.enable=true
我算了一下,我的程序在结构上要重新布局: 1.将主函数也即测试步骤进行的函数分割,通过判断标志压缩运行时间; 2.将分割后的函数再细分,长时间运行的函数再细分,将其运行时间压缩,这样用了DOEVENTS后控制权也能快速放出 就现在的情况来说,不这样分就用不了DOEVENTS,因为不用DOEVNETS的话程序就象死机一样,虽然仪器还在动,呵呵
引用 26 楼 taoguangye 的回复:
DOEVENTS使用要小心呀,这种程序中不要使用DOEVENTS
谢谢你的回复,但这种程序还是需要用DOEVENTS的
引用 27 楼 taoguangye 的回复:
timer控件的精度在15ms左右
谢谢你的回复,100ms以内的误差都可以接受
taoguangye 2013-11-06
  • 打赏
  • 举报
回复
timer控件的精度在15ms左右
taoguangye 2013-11-06
  • 打赏
  • 举报
回复
DOEVENTS使用要小心呀,这种程序中不要使用DOEVENTS
加载更多回复(23)

1,451

社区成员

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

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