⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fmian.frm

📁 一份串口通信的好资料,对初学串口者很有用滴
💻 FRM
📖 第 1 页 / 共 2 页
字号:
      Case comEvDSR   ' Change in the DSR line.

      Case comEvRing   ' Change in the Ring Indicator.
      Case comEvReceive   ' Received RThreshold # of
                        ' chars.
                        
        'If firstr = False Then
            'NOTE.Text = NOTE.Text & "Data Receive:"
            'firstr = True
        'Else
        
        'List1.AddItem Counts
        'Counts = Counts + 1
        
        Delay 0.02 'delay 过小几乎没作用#24 似乎有点说不过去 为 0。001 的时候 和0。002 结果就不一样
        '而这时间差引起的差异似乎不能用下面的观点来解释。。。
        '
        'DEBUG  0.00195-0.00196 就产生了差距 是处理时间差? 差 0.00001...
        '
        '
        '
        
        'MsgBox "':::L"
        '问题也许出在收发的时候  加上时间延迟 就能取走全部数据 不延迟 数据过长时候不过全部获得
        '代码执行速度快于从缓冲中获得数据时间#???????
        '用延迟的效果和一个弹出对话框被确定后的数据采集
        
        '相当于 产生ONCOMM 事件时候 数据并未稳定在线路上而 这时候数据采集 只采集到部分 程序执行速度过快
        '遗漏数据的在后面事件到达时候被采集?调试的错误似乎证明这点。
        
        
        '另一个问题就是延迟后产生许多 ONCOMM 事件 其实是空的  用 NUM=0 判断是“系统异常”ONCOMM 事件
        '。。。。。捆饶好久的问题#75 为什么会产生多的ONCOMM 事件#24。,,》?????
        
        '虽然我没统计出现ONCOMM 事件个数 大概推测下: 是WINDOWS  消息队列 在DELAY 时候 后面的消息未
        '被处理 因为来一个字符产生一个ONCOMM 事件 所以 后面字符在相继到来后触发多个ONCOMM 事件
        ' N=???????? 后面的事件被保存在消息队列中 而字符已经进入缓冲区 所以 第一次读就全部读出来了
        '有时间调试下 到底出现多少个ONCOMM 事件  验证下
        
        '以下 CASE 0 情况的新代码本机调试通过 不过 10的时候的代码本机调试也是通过的#8 伤心啊
        '上机就不对了 当然我并未发现 数据超长引发的数据丢失问题 这点现在才发现
        '但是为什么  CASE 10 情况在不同系统中调试出现的 多个CHR(13)被检测出并显示异常
        'SUCH AS REC:AREC:AREC:A。。。。。。
        'AND    REC:AAAAAAREC:AAAAAAREC:AAAAAA。。。。OR  REC:111111111111REC:11111111111REC:11111111。。。
        '数据不能正确接收!!!!!!!?????????????
        '是计算机处理速度问题#?/?/????/
        
        'debug
    Select Case IS_ARQ
        Case True
            Select Case MSComm.Tag
                Case 0 '接收端
                    num = MSComm.InBufferCount
                    Do
                    DoEvents
                        data = data & MSComm.Input
                        num = num - Len(data)
                    Loop Until num = 0
                    If data <> "" Then
                        'check if is a data
                        Replay = Left(data, 4)
                        If CONREQ = False Then '有数据到达 但是并非所期望
                            If InStr(Replay, "ACK") Then '
                                ReplayID = CInt(Right(data, 1))
                                '期待 ID=0 的出现
                                If ReplayID = EXPID Then
                                    CONREQ = True
                                    Fmain.MSComm.Output = "ACK" & Chr(EXPID)
                                End If
                                'NOTE.Text = NOTE.Text & "REC:" & ReplayID & vbCrLf
                            End If
                        Else
                            If InStr(Replay, EOT) Then
                            Else
                                'getreplayID
                                Do While ReplayID <> EXPID
                                    DoEvents
                                    Delay (1)
                                    OUTREQTIME = OUTREQTIME + 1
                                    If OUTREQTIME = 10 Then
                                        Fmain.MSComm.Output = "ACK" & Chr(EXPID)
                                        Exit Sub
                                    End If
                                Loop
                            End If
                        End If
                    End If
                Case 1 '发送端
                    num = MSComm.InBufferCount
                    Do
                    DoEvents
                        data = data & MSComm.Input
                        num = num - Len(data)
                    Loop Until num = 0
                    If data <> "" Then
                        Replay = Left(data, 4)
                        
                        If CONREQ = False Then '有数据到达 但是并非所期望 但是可以假定已经得到客户响应
                            If InStr(Replay, "ACK") Then '非 ACK 信息 系统的SENDNEXT 为假 一直循环
                                ReplayID = CInt(Right(data, 1))
                                '期待 ID=0 的出现
                                If ReplayID = EXPID Then
                                    CONREQ = True
                                    SENDNEXT = True
                                    EXPID = (EXPID + 1) Mod 2
                                    NOTE.Text = NOTE.Text & "REC:" & data & vbCrLf
                                Else
                                    '重发数据
                                    Fmain.MSComm.Output = packold
                                End If
                                'NOTE.Text = NOTE.Text & "REC:" & ReplayID & vbCrLf
                            Else
                                Fmain.MSComm.Output = "ENQ"
                                NOTE.Text = NOTE.Text & "SND:ENQ " & vbCrLf
                                Do While CONREQ <> True
                                    DoEvents
                                    Delay (1)
                                    OUTREQTIME = OUTREQTIME + 1
                                    If OUTREQTIME = 10 Then
                                        NOTE.Text = NOTE.Text & "接收端未响应 超时退出" & vbCrLf
                                        Exit Sub
                                    End If
                                Loop
                            End If
                        Else
                            If InStr(Replay, "ACK") Then '非 ACK 信息 系统的SENDNEXT 为假 一直循环
                                ReplayID = CInt(Right(data, 1))
                                '期待 ID=0 的出现
                                If ReplayID = EXPID Then
                                    CONREQ = True
                                    SENDNEXT = True
                                    EXPID = (EXPID + 1) Mod 2
                                    NOTE.Text = NOTE.Text & "REC:" & data & vbCrLf
                                Else
                                    '重发数据
                                    Fmain.MSComm.Output = packold
                                End If
                                'NOTE.Text = NOTE.Text & "REC:" & ReplayID & vbCrLf
                            End If
                        End If
                    End If
            End Select
            
        Case False
        '非 ARQ 模式时候
        Select Case Me.MSComm.InputMode
            
            Case 30
            Do
                DoEvents
                buffer$ = buffer$ & MSComm.Input
            Loop Until InStr(buffer$, "OK" & vbCrLf)
            NOTE.Text = NOTE.Text & "REC:" & buffer$ & vbCrLf
            
            Case 0
                num = MSComm.InBufferCount
                Do
                DoEvents
                    data = data & MSComm.Input
                    num = num - Len(data)
                Loop Until num = 0
                If data <> "" Then
                    NOTE.Text = NOTE.Text & "REC:" & data & vbCrLf
                End If
                If InStr(data, "ENQ") Then
                   MSComm.Tag = 0
                   M_ARQ_Click
                   Fmain.MSComm.Output = "ACK0"
                End If
                    
                    
                NOTE.SetFocus
                SendKeys "{PGDN}"
                SendKeys "{PGDN}"
                'Tsend.SetFocus
                SendKeys "{TAB}"
            Case 220
                
                MSComm.InputLen = 0
                num = MSComm.InBufferCount
                
                If num <> 0 Then
                    'data = Space(num)
                    data = MSComm.Input
                        
                    Debug.Print num
                    
                    'MsgBox CStr(num) & "/" & data
                    MSComm.InBufferCount = 0
                    NOTE.Text = NOTE.Text & "REC:" & data & vbCrLf
                    
                    
                    
                    '哈哈 小徐发明的技巧
                    NOTE.SetFocus
                    SendKeys "{PGDN}"
                    SendKeys "{PGDN}"
                    'Tsend.SetFocus
                    SendKeys "{TAB}"
                
                End If
            Case 1
                
                MSComm.InputLen = 0
                num = MSComm.InBufferCount
                
                If num <> 0 Then
                    'data = Space(num)
                    data = MSComm.Input
                        
                    Debug.Print num
                    
                    'MsgBox CStr(num) & "/" & data
                    MSComm.InBufferCount = 0
                    NOTE.Text = NOTE.Text & "Rec:" & data & vbCrLf
                        
                    '哈哈 小徐发明的技巧
                    NOTE.SetFocus
                    SendKeys "{PGDN}"
                    SendKeys "{PGDN}"
                    'Tsend.SetFocus
                    SendKeys "{TAB}"
                
                End If
                
            Case 10 'Debug old edition
            
                '这代码在数据短时本机调试通过 数据过长出问题 为什么?
                '在上机调试 无数据接收;;;;;
                MSComm.InputLen = 0
            
                charc = MSComm.Input
                If Asc(charc) <> 13 Then
                    bufferr = bufferr & charc
                Else
                    NOTE.Text = NOTE.Text & "Rec:" & bufferr & vbCrLf
                    bufferr = ""
                End If
                MSComm.InBufferCount = 0
                
            Case 110 'Debug old edition

                MSComm.InputLen = 0
            
                charc = MSComm.Input
                If Asc(charc) <> 13 Then
                    bufferr = bufferr & charc
                Else
                    NOTE.Text = NOTE.Text & "Rec:" & bufferr & vbCrLf
                    bufferr = ""
                End If
                MSComm.InBufferCount = 0
                
            
            Case 11
                MSComm.InputLen = 0
            
                charb = MSComm.Input
                If AscB(charb) <> 13 Then
                    bufferr = bufferr & charb 'Chr(Left(Asc(charb), 2)) & Chr(Right(Asc(charb), 2))
                Else
                    NOTE.Text = NOTE.Text & "Receive:" & bufferr & vbCrLf
                    bufferr = ""
                End If
                MSComm.InBufferCount = 0
                
        End Select
    End Select

            'bufferr = ""
            
                'firstr = False
            'End If
            '
            'MsgBox "q"
           
            
      Case comEvSend   ' There are SThreshold number of
                     ' characters in the transmit
                     ' buffer.
                     
      Case comEvEOF   ' An EOF charater was found in
                     ' the input stream

    
    End Select
    
    'debug
    't2 = Timer
    
    
    'Debug.Print t2
End Sub



Private Sub SENDEVENT_CONREQA(CONREQA As Boolean)
    DoEvents
    If CONREQ Then CONREQA = True
End Sub

Private Sub SENDEVENT_SENDNEXTA(SENDNEXTA As Boolean)
    DoEvents
    If SENDNEXT Then SENDNEXTA = True
End Sub

Private Sub Tsend_KeyPress(KeyAscii As Integer)

    
'ARQMODE CHOICE
If IS_ARQ = False Then
    If KeyAscii = 13 Then
        If is_cominuse = True Then
            'ind = 0
            buffer1 = Tsend.Text
            MSComm.Output = buffer1 & Chr$(13)
            NOTE.Text = NOTE.Text & "SND:" & Tsend.Text & vbCrLf
            Tsend.Text = ""
            KeyAscii = 0
        Else
            NOTE.Text = NOTE.Text & "当前未连接!数据发送无效!" & vbCrLf
            Tsend.Text = ""
        End If
    Else
        'BUFFER(ind) = Chr$(KeyAscii)
        'MSComm.OutBufferCount = Len(Tsend.Text)
        'ind = ind + 1
    End If
    
Else

    'ARQ MODE
    
    
End If


    
    
End Sub




Public Sub send(filename As String, msglen As Long)
    SENDEVENT.SendFile filename, msglen
End Sub


















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -