怎样在子程序中暂停一段时间,以等待串行口数据?(vb) 点击:6916 | 回复:13



gongkongedit

    
  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-10-28 10:27:00
楼主
我编了一个从工控主机中采集数据的程序,因工控机响应很慢需要在子程序中暂停一段时间,是处理器能够接受串口返回的响应,但又不离开该子程序. 我现在的做法是:利用一个很长的循环,这样一来有时串行口收不到数据(成功率是80%). 各位大虾救救我!我用的是vb6.0.



gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2001-01-13 12:11:00
1楼
其实一般均用校验的方法检查数据是否收到,再读串口,不用循环等待. 比较简单的是循环检查串口缓冲区数据长度,当长度达到应该接收的数据量时,读串口缓冲区,保证数据完整,但抗干扰 能力较差.

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2001-04-21 02:18:00
2楼
我作过着类的软件,也是用VB6做的,用的方法是中断接收数据,当然也可以用查询数据长度的办法,单很费PC进程的!有问题可以和我联系!

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2001-04-23 19:32:00
3楼
可以用控件中的MSCOMM 控件,可以解决这一问题

yxsheng

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 12回
  • 年度积分:0
  • 历史总积分:198
  • 注册:2001年4月21日
发表于:2001-04-27 22:17:00
4楼
用中断方法检测时,若通讯部件发生故障,则容易造成死机,我的方法是先延时一段时间,再检查串口缓冲区数据长度,当长度达到应该接收的数据量时,读串口缓冲区,该方法虽然浪费cpu,但程序较稳定。至于延时时间,则需不断调试至合适数值。哪位大侠有更好的方法,请告之.

牛头人

  • 精华:3帖
  • 求助:0帖
  • 帖子:55帖 | 134回
  • 年度积分:0
  • 历史总积分:436
  • 注册:2001年4月30日
发表于:2001-05-07 16:16:00
5楼
我不明白你是怎样处理串口数据,你可以试试以下方法: 1。在中断中处理 2。接受缓冲区的长度增大,延时检测。

gyr

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2回
  • 年度积分:0
  • 历史总积分:2
  • 注册:2001年5月11日
发表于:2001-05-11 21:03:00
6楼
可以用控件中的MSCOMM 控件的oncomm事件,无须用延时.

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2001-05-14 20:43:00
7楼
用vb是比较麻纺的,用定时器吧. 我试过用子线程来打开串口通讯,可是出现非法操作.用C++就没有问题,是vb的问题. 我用一个子线程不停循环通讯,把数据发给主线程

吾晓。

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 23回
  • 年度积分:0
  • 历史总积分:26
  • 注册:2002年2月19日
发表于:2001-05-20 22:40:00
8楼
我觉得最好的方法是采用多线程通信方法,在我的应用实例中,其通信可靠性、软件开发效率和通信效率都可以有很大的提高。 具体做法您可以自己编写ACTIVEX控件或DLL而实现。因为我目前正在忙于找工作,具体实例暂时没有时间上传,具体问题欢迎来信讨论。 另,请问诸位,在哪里可以找到月薪5000左右的自控行业的工作?我可以独立完成一般自控项目的软硬件方案设计和施工管理,对锅炉自控改造燃烧器自控和楼宇自控较熟。

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-09-28 10:32:00
9楼
一般发送数据后,要延时才能去读数据, 可用doevent()函数,效果是可以的。()内是时间,我曾用25毫秒。

d_f

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 45回
  • 年度积分:0
  • 历史总积分:53
  • 注册:2003年12月09日
发表于:2003-09-29 14:21:00
10楼
VB开多线程比较麻烦,最好的办法是用TIMER,隔一段时间读一次。

controlPLC

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 54回
  • 年度积分:0
  • 历史总积分:188
  • 注册:2003年8月07日
发表于:2003-10-27 16:07:00
11楼
下面一段程序,可能对你有用 private sub send dim cmd as string cmd="ok,request data" mscomm1.output=cmd timer.enable=true end sub Private Sub Timer1_Timer() 延时读取 If Me.MSComm1.InBufferCount > 0 Then MSComm1_OnComm End If Me.Timer1.Enabled = False End Sub Private Sub MSComm1_OnComm()接收数据 Dim recstr As String If Me.MSComm1.InBufferCount > 0 Then recstr = Me.MSComm1.Input End If End Sub

PROFIBUS-DP

  • 精华:0帖
  • 求助:0帖
  • 帖子:74帖 | 306回
  • 年度积分:0
  • 历史总积分:637
  • 注册:2003年8月29日
发表于:2003-10-28 10:27:00
12楼
通信程序应该采用多线程 用定时器至少也有50ms的延时,你可以调用Win32API实现延时 我来先给出Delphi源程序,有问是可以我QQ39161700联系 procedure TimeDelay(DT:DWORD); var TT:DWORD; begin TT:=GetTickCount(); While (GetTickCount()-TT)<DT do Application.ProcessMessages; end;

marker

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 1回
  • 年度积分:0
  • 历史总积分:17
  • 注册:2003年8月07日
发表于:2004-06-21 18:07:00
13楼
我个人觉得使用mscomm实现起来是比较简单的。方法就是将其阀值设定为1(即当数据发送到串口,就触发事件),可以在事件处理中定义一个变量,把接收的数据连接起来,达到长度才就处理。这样速度和可靠性都比较高(有疑问交流 qq:40452910)

热门招聘
相关主题

官方公众号

智造工程师