代码修改如下,调试时见实时错误'8018',只有端口打开时,操作有效.
Option Explicit
Private outtemp(5) As Byte '//接收数组
Private chnlcnt As Integer
Private samflag As Boolean
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.InBufferSize = 20
MSComm1.OutBufferSize = 20
MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = 1
MSComm1.SThreshold = 0
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 1
outtemp(0) = &H1
outtemp(1) = &H2
outtemp(2) = &H30
outtemp(3) = &H30
outtemp(4) = &H3End SubPrivate Sub MSComm1_OnComm()
Dim Buffer As Variant
samflag = False
With MSComm1
 Select Case .CommEvent
 Case comEvReceive
  Buffer = .Input
  intemp(1) = Buffer(0)
  If intemp(1) = &H2 Then
      .RThreshold = 0       '关闭OnComm事件接收
  Do
     DoEvents
   Loop Until .InBufferCount >= 1
      Buffer = .Input
      intemp(2) = Buffer(0)
  If intemp(2) = &H1E Then  '//如果是联络帧,五个字节
     Label1.Caption = "连接成功"
       Do
     DoEvents
   Loop Until .InBufferCount >= 3 '//一直到接收完数据
   commok = True
  End If '//联络部分
  If intemp(2) = &H6 Then '//要求重发数据
    Do
     DoEvents
   Loop Until .InBufferCount >= 3
  End If
  If intemp(2) = &H1F Then '是数据 数据帧11字节
   Do
     DoEvents
   Loop Until .InBufferCount >= 8
       Buffer = MSComm1.Input
       intemp(3) = Buffer(0)
       Buffer = MSComm1.Input
       intemp(4) = Buffer(0)
       Buffer = MSComm1.Input
       Buffer = MSComm1.Input
       indata(0) = Buffer(0)
       Buffer = MSComm1.Input
       indata(1) = Buffer(0)
       Buffer = MSComm1.Input
       indata(2) = Buffer(0)
       Buffer = MSComm1.Input
       indata(3) = Buffer(0)
       Buffer = MSComm1.Input
       indata(4) = Buffer(0)
       Buffer = MSComm1.Input
       samflag = True '//一组数据接受完毕
       End If
       End If
    MSComm1.RThreshold = 1
 Case Else
 End Select
 End With
End Sub
'定时器2s
Private Sub Timer3_Timer()
 If chnlcnt >= 8 Then
    chnlcnt = 1
    Timer3.Enabled = False
    samflag = False
   Exit Sub
  End If
outtemp(3) = chnlcnt
MSComm1.Output = outtemp '//采集命令outtemp(3)为通道号
Do
     DoEvents
Loop Until samflag
samflag = False
chnlcnt = chnlcnt + 1
End Sub 3
  End If
  If intemp(2) = &H1F Then '是数据 数据帧11字节
   Do
     DoEvents
   Loop Until .InBufferCount >= 8
       Buffer = .Input
       intemp(3) = Buffer(0)
       Buffer = .Input
       intemp(4) = Buffer(0)
       Buffer = .Input
       Buffer = .Input
       indata(0) = Buffer(0)
       Buffer = .Input
       indata(1) = Buffer(0)
       Buffer = .Input
       indata(2) = Buffer(0)
       Buffer = .Input
       indata(3) = Buffer(0)
       Buffer = .Input
       indata(4) = Buffer(0)
       Buffer = .Input
       samflag = True '//一组数据接受完毕
       End If
       End If
    .RThreshold = 1
 Case Else
 End Select
 End With
End Sub
定时器2s
Private Sub Timer3_Timer()
 If chnlcnt >= 8 Then
    chnlcnt = 1
    Timer3.Enabled = False
    samflag = False
   Exit Sub
  End If
outtemp(3) = chnlcnt
MSComm1.Output = outtemp '//采集命令outtemp(3)为通道号
Do
     DoEvents
Loop Until samflag
samflag = False
chnlcnt = chnlcnt + 1
End Sub

解决方案 »

  1.   

    你是说把变量改为私有的,不过我的程序是把输出outtemp 定义在一个全局模块中的,
    为什么只能采三个通道的数,程序就不行了,
      

  2.   

    你的timer控件定的时间常数是多少?
      

  3.   

    感觉程序好像还不全阿。。你里面的intemp和indata2个数组定义了没有?
      

  4.   

    Timer时间设置为2000MS,如设置为2则有可能来不及反应。
      

  5.   

    TIMER控件的属性Interval设置值是以毫秒为单位,所以2S必须设置为2000
      

  6.   

    检查你MSCOMM控件的波特率是多少,而且应与下位机一致.你接收命令的字长是多少,每字节按10个数据位(二进制).假如波特率为9600,则每秒可传送960个ASCII码的信息.2秒理论上可接收1920个ASCII码.如果接收数据单条不到100字长,应将TIMER控件的Interval设置的小些,为100到200毫秒为宜.
      

  7.   

    谢谢大家热心帮助,问题已解决了,下位机程序考虑不周导致的,感谢zdingyun的热心帮忙,给他加上50分