+ -
当前位置:首页 → 问答吧 → mscomm控件无法触发oncomm事件

mscomm控件无法触发oncomm事件

时间:2008-06-10

来源:互联网

我的代码如下
Private Sub Form_Load()
  succeedStr = "333366"
  failStr = "6666cc"
  clearApparatusStr = "553085"
  linkStr = "551065"
  MSComm.CommPort = 1 '默认为com1口
  MSComm.OutBufferSize = 1024 '输出缓冲区大小
  MSComm.InBufferSize = 1024 '输入缓冲区大小
  MSComm.InputMode = 1 '数据接收模式为二进制模式 二进制与十六进制处理是相同的
  MSComm.Settings = "9600,n,8,1 " '设置参数,默认为:波特率9600;无校验;数据位8;停止位1

End Sub


Private Sub MSComm_OnComm()
  Select Case main.MSComm.CommEvent
  Case comEvReceive
  main.MSComm.InputMode = comInputModeText
  onlineRet = onlineRet + main.MSComm.Input
  ' MsgBox onlineRet
  Case comEvSend
  End Select
End Sub
Private Sub Toolbar1_ButtonMenuClick(ByVal ButtonMenu As MSComctlLib.ButtonMenu)

  Select Case ButtonMenu
  Case "联机检查"
  ret = test_link()
  End Select
   
End Sub




Public Function test_link() As Boolean '检测联机
  If main.MSComm.PortOpen = False Then
  main.MSComm.PortOpen = True
  End If
  Dim ret As Boolean
  Dim sendstr As String
  sendstr = linkStr
  ret = send_command(sendstr)
End Function
Public Function send_command(sendstr As String) As Boolean
  Dim onlineStr As String
  Dim onlineRet As String
  Dim noOnlineStr As String
  Dim sBool As Boolean '为了使用户在点击中断按钮时结束下面的循环,主要是为解决doEvents(),应该把这个变量设为全局的
  ' sBool = True
  onlineRet = ""
  noOnlineStr = failStr
  linkSucced = succeedStr
  main.MSComm.InBufferCount = 0
  main.MSComm.Output = sendstr
  main.MSComm.InputLen = 1
  main.MSComm.RThreshold = 1 '设置一次从接收缓冲区读取字节数为1
  main.MSComm.SThreshold = 1 '设置一次从发送缓冲区读取字节数为1
End Function


我用串口调试助手能够接收到发送的数据,但是用串口调试助手发送数据,程序确不能接收到数据,不能触发oncomm事件mscomm.CommEvent返回的值不是comEvReceive,我通过msgbox mscomm.CommEvent得到的值是1,我查的资料是comEvReceive=1不明白为什么没有执行Case comEvReceive里面的语句呢

作者: zydream6   发布时间: 2008-06-10

Private Sub MSComm1_OnComm() '接收到数据
  Dim Ip() As Byte
  Dim Buf As String
 
  Select Case MSComm1.CommEvent
  Case comEvReceive
  Ip = MSComm1.Input
  For i = LBound(Ip) To UBound(Ip)
  If Len(Hex(Ip(i))) = 1 Then Buf = Buf & "0"
  Buf = Buf & Hex(Ip(i))
  Next

  End Select

End Sub

作者: alifriend   发布时间: 2008-06-10

我试了用这种方法,主要问题是根本就不执行Case comEvReceive里面的程序

作者: zydream6   发布时间: 2008-06-10

把你的串口的2、3脚连接起来,再测试你的程序是否正常。

作者: li_yaoming   发布时间: 2008-06-10

LZ:
仔细研究你代码
1)你的ONCOMM事件中的变量onlineRet未见声明
2)函数test_link未见调用处(则串口未打开)
代码修改如下
VBScript code
Option Explicit
    Dim succeedStr, failStr
    Dim clearApparatusStr, linkStr, linkSucced
    Dim onlineRet As String

Private Sub Command1_Click()'打开串口
    test_link
End Sub

Private Sub Form_Load()
    succeedStr = "333366"
    failStr = "6666cc"
    clearApparatusStr = "553085"
    linkStr = "551065"
    MsComm.CommPort = 1  '默认为com1口
    MsComm.OutBufferSize = 1024 '输出缓冲区大小
    MsComm.InBufferSize = 1024 '输入缓冲区大小
    MsComm.InputMode = 1 '数据接收模式为二进制模式 二进制与十六进制处理是相同的
    MsComm.Settings = "9600,n,8,1 "  '设置参数,默认为:波特率9600;无校验;数据位8;停止位1
End Sub

Private Sub MSComm_OnComm()
    Select Case main.MsComm.CommEvent
        Case comEvReceive
            main.MsComm.InputMode = comInputModeText
            onlineRet = onlineRet + main.MsComm.Input
            Text1 = onlineRet
        Case comEvSend
    End Select
End Sub
Private Sub Toolbar1_ButtonMenuClick(ByVal ButtonMenu As MSComctlLib.ButtonMenu)
End Sub
    Select Case ButtonMenu
    Case "联机检查"
        ret = test_link()
    End Select
End Sub

Public Function test_link() As Boolean  '检测联机
    If main.MsComm.PortOpen = False Then
        main.MsComm.PortOpen = True
    End If
    Dim ret As Boolean
    Dim sendstr As String
    sendstr = linkStr
    ret = send_command(sendstr)
End Function
Public Function send_command(sendstr As String) As Boolean
    Dim onlineStr As String
    Dim onlineRet As String
    Dim noOnlineStr As String
    Dim sBool As Boolean    '为了使用户在点击中断按钮时结束下面的循环,主要是为解决doEvents(),应该把这个变量设为全局的
  ' sBool = True
    onlineRet = ""
    noOnlineStr = failStr
    linkSucced = succeedStr
    main.MsComm.InBufferCount = 0
    main.MsComm.Output = sendstr
    main.MsComm.InputLen = 1
    main.MsComm.RThreshold = 1 '设置一次从接收缓冲区读取字节数为1
    main.MsComm.SThreshold = 1 '设置一次从发送缓冲区读取字节数为1
End Function

作者: zdingyun   发布时间: 2008-06-11

RThreshold 没有设置,当然不会触发接收事件。另外,comEvReceive = 2.

作者: of123   发布时间: 2008-06-12

变量都定义了,RTreshold我设的是1,调试助手能接收到数据,我用调试助手去发数据时,我的程序不能接收,
不知道是为什么

作者: zydream6   发布时间: 2008-06-14

UP
做个记号,以便备用

作者: hujuncode   发布时间: 2008-09-15

人过留声。

作者: zhanb_go   发布时间: 2008-09-18

mark

作者: AwillAway   发布时间: 2011-11-26

mark

作者: AwillAway   发布时间: 2011-11-26

热门下载

更多