首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

vb串口通讯,定式循环接收如何不行

2012-01-10 
vb串口通讯,定式循环接收怎么不行,请指教vb串口通讯,我想用定时器设定时间定时接收数据,但是怎么不行呢,请

vb串口通讯,定式循环接收怎么不行,请指教
vb串口通讯,我想用定时器设定时间定时接收数据,但是怎么不行呢,请高手指教,谢谢

Private Sub Command1_Click()
Dim SendStr(8) As Byte
  SendStr(0) = &H1
  SendStr(1) = &H4
  SendStr(2) = &H0
  SendStr(3) = &H64
  SendStr(4) = &H0
  SendStr(5) = &H1
  SendStr(6) = &H70
  SendStr(7) = &H15
  MSComm1.InBufferCount = 0
  MSComm1.RThreshold = 0 
  MSComm1.Output = SendStr
  Timer1.Enabled = True
End Sub

Private Sub Command2_Click()
 Timer1.Enabled = False
End Sub

Private Sub Command3_Click()
Unload Me
End Sub

Private Sub Form_Load()
MSComm1.Settings = "9600,n,8,1"
MSComm1.CommPort = 5
MSComm1.SThreshold = 0
MSComm1.InputLen = 0 
MSComm1.InputMode = comInputModeBinary
MSComm1.InBufferCount = 0 
  MSComm1.OutBufferCount = 0 

  If MSComm1.PortOpen = False Then
  MSComm1.PortOpen = True
  End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
 If MSComm1.PortOpen = True Then
  MSComm1.PortOpen = False
End If
End Sub

Private Sub Timer1_Timer()
  Dim inx() As Byte
  inx = MSComm1.Input '接收数据
  MSComm1.InBufferCount = 0
   
  Text1.Text = inx(0) 
  Text2.Text = inx(1)
  Text3.Text = inx(2)
  Text4.Text = inx(3)
  Text5.Text = inx(4)
  Text6.Text = inx(5)
  Text7.Text = inx(6)
  Timer1.Enabled = False
  End Sub
   


[解决办法]
你应该看看正常的使用方法(依靠串口事件),用定时器在理论上都不可行,怎么可能成事呢?
应用程序的定时器是个玩具,根本就不准,效率也很低,比如你开着一个程序,正在用定时器工作,如果这个是有某个程序运行起来把CPU跑到100%,估计你那个定时器也就停了,直至CPU恢复,他才会继续运行。这种不稳定的定时器能用来事实通讯吗?而且基本单位是毫秒,你知道吗,串行通讯跑个一般的频率是这么计算的, 1000000 纳秒/9600=104.16666666666666666666666666667 纳秒 传输一个二进制位,如果不是驱动程序直接调用 CPU 中断,应用程序根本没法以这样精细的中断定时器工作,所以,当CPU串行中断完成时驱动会先将收到的数据放入缓存,当有一定通讯时间或到达一定缓存量后,驱动会通过消息或驱动状态参数告知应用程序已收到数据,而这种过程因为是在驱动中直接调用CPU中断执行,效率是能得到保障的,这就是在API里完成一个读的过程的由来,在MSComm控件中,当完成一个API读的过程,就会产生一个事件告知用户。这就是为什么收信息是在 MSComm 控件事件的关系,用Timer事件,根本就打乱了整个通讯的过程,而且还有不稳定现象,怎么会不出问题。
[解决办法]

VB code
Private Sub MSComm1_OnComm()...End Sub
[解决办法]
因为定时器的间隔与事件的触发很可能不一致。

[解决办法]
用事件触发,很简单的。

[解决办法]
依据你的程序改了下:
VB code
Option ExplicitPrivate Declare Function GetTickCount Lib "kernel32" () As LongPrivate Sub Command1_Click()    Timer1.Enabled = TrueEnd SubPrivate Sub Command2_Click()    Timer1.Enabled = FalseEnd SubPrivate Sub Command3_Click()    Unload MeEnd SubPrivate Sub Form_Load()    MSComm1.Settings = "9600,n,8,1"    MSComm1.CommPort = 5    MSComm1.RThreshold = 0    MSComm1.InputLen = 0    MSComm1.InputMode = comInputModeBinary    MSComm1.InBufferCount = 0    MSComm1.OutBufferCount = 0        If MSComm1.PortOpen = False Then        MSComm1.PortOpen = True    End IfEnd SubPrivate Sub Form_Unload(Cancel As Integer)    If MSComm1.PortOpen = True Then        MSComm1.PortOpen = False    End IfEnd SubPrivate Sub Timer1_Timer()    Dim inx() As Byte    Dim SendStr(8) As Byte    Dim lngP As Long        SendStr(0) = &H1    SendStr(1) = &H4    SendStr(2) = &H0    SendStr(3) = &H64    SendStr(4) = &H0    SendStr(5) = &H1    SendStr(6) = &H70    SendStr(7) = &H15    MSComm1.InBufferCount = 0    MSComm1.RThreshold = 0    MSComm1.Output = SendStr    '延迟100ms,以便下位机数据完全上传    lngP = GetTickCount    Do        DoEvents    Loop Until GetTickCount - lngP >= 100    inx = MSComm1.Input '接收数据    MSComm1.InBufferCount = 0          Text1.Text = inx(0)    Text2.Text = inx(1)    Text3.Text = inx(2)    Text4.Text = inx(3)    Text5.Text = inx(4)    Text6.Text = inx(5)    Text7.Text = inx(6)    Timer1.Enabled = FalseEnd Sub 


[解决办法]
如果多个下位机使用同一串口与主机通信,且所有的会话都是主机发起的,可以用定时模式。

反之,如果下位机可以发起会话,则不可用定时模式。

[解决办法]
你不是说不能接收数据吗?和CPU占用率有何干?就Timer中的代码而言,CPU占用率90%只会片刻(100ms多一些)
[解决办法]
试一试这个,如果OK请依据它改写你的代码
[解决办法]
串口多机通讯的基础是数据包格式和数据分发队列过程,而不是应用程序的定时器,这种概念误差,会影响项目可行性和稳定性。还有,VB弄串口通讯如果通讯过程比较频繁,CPU占用率一定会很高的,要在VB里控制好CPU的资源,不易做到,如果直接用微软的控件,这个问题是无法解决的,即使是在VC下用控件,效果也是如此,如果想涉及程序效率或资源控制这一块,最好还是自己用C/C++ 和 API加上多线程技术来弄,在我的资源里就用VC写了个串口通讯静态库类,这个类可以很好的控制住CPU占用率,基本上频繁的通讯只会站到0%-1%之间。不过是提供给VC开发用的,VB用不了。要在VB实现也不是不可能,只是效率不会降这么低,而且稳定性也不见得很高,最重要的是开发的时候有很多细节要调整,不能像普通VC环境下的API使用那么用,还要根据VB的情况调整,因为用到了多线程技术,所以比较麻烦。
[解决办法]
还有,通常多机通讯的过程上位机只需要做简易的主控接口就可以了,数据交换与委派部分通常由下位机的主控机完成,这样效率会高很多,我曾经做过一个项目,是多机无线通讯的项目,一台主控下位机,28台子机,一台PC机,开始直接用PC做数据交换以及任务队列分发部分,但发现,效率极低,后来将这个过程用下位机的主控机来做,主控机就相当于一台无线串行交换机的功能,效率得到了很大改善,这么说,原来的交换过程要等上几秒才能完成一个过程,后来的交换过程完全没感觉有要等待的过程,所以有时候把过程放到下位机去处理效率会更加高。

热点排行