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

📄 fmian.frm

📁 一份串口通信的好资料,对初学串口者很有用滴
💻 FRM
📖 第 1 页 / 共 2 页
字号:
    
End Sub

Private Sub M_SAVE_Click()
    
    If is_cominuse = True Then
        COMSAVE
    Else
    End If
End Sub



Private Sub M_NCON_Click()
            
    Dim a As Integer
    
    If is_cominuse = True Then
        a = MsgBox("连接" & COMNAME & "正在被使用是否关闭此连接?", vbInformation + vbYesNo, "提示")
        
        If a = 6 Then
            Fmain.MSComm.PortOpen = False
            is_cominuse = False
            Fmain.StatusBar.Panels(1).Text = TCOM.COMPORT & "断开连接"
            Fmain.Caption = "网络通讯实验程序(BY:c0der)"
        Else
            Exit Sub
        End If
    Else
    
    End If
        
    CHO.Show
    
End Sub




Private Sub M_SET_Click()
    SETT2.Show
End Sub

Private Sub MSComm_OnComm()

    Dim charc As String * 1
    
    Dim data As Variant
    Dim num   As Double
    'Dim t1 As Single
    'Dim t2 As Single
    'Dim t3 As Single
    
    Dim charb As Variant
    
    
    't1 = Timer
    'Debug.Print t1
    
    Select Case MSComm.CommEvent
    
    ' Errors
      Case comEventBreak   ' A Break was received.
      Case comEventFrame   ' Framing Error
      Case comEventOverrun   ' Data Lost.
      Case comEventRxOver   ' Receive buffer overflow.
      Case comEventRxParity   ' Parity Error.
      Case comEventTxFull   ' Transmit buffer full.
      Case comEventDCB   ' Unexpected error retrieving DCB]

   ' Events
      Case comEvCD   ' Change in the CD line.
      Case comEvCTS   ' Change in the CTS line.

      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 False
        '非 ARQ 模式时候
        Select Case Me.MSComm.InputMode
            Case 0
                num = MSComm.InBufferCount
                Do
                DoEvents
                    data = data & MSComm.Input
                    num = num - Len(data)
                Loop Until num = 0
                If data <> "" Then
                    
                If InStr(data, "ENQ") Then
                   'MSComm.Tag = 0
                   Fmain.MSComm.Output = "ACK0"
                   Tsend.Enabled = False
                   NOTE.Text = NOTE.Text & "REC:" & data & vbCrLf
                   'Delay (10)
                ElseIf InStr(data, "EOT") Then
                    NOTE.Text = NOTE.Text & "REC:" & data & vbCrLf
                    Tsend.Enabled = True
                ElseIf InStr(data, "ACK") Then
                    NOTE.Text = NOTE.Text & "REC:" & data & vbCrLf
                    ISCON = True
                    throwmsgs data '主动发送端的处理
                Else
                    throwmsgc data '被动接收端自动处理
                End If
                
                End If
                
                    
                    
                NOTE.SetFocus
                SendKeys "{PGDN}"
                SendKeys "{PGDN}"
                'Tsend.SetFocus
                SendKeys "{TAB}"
            
            

               
        End Select
    End Select

 
            
      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
    
  
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
            If ISCON <> True Then
                MSComm.Output = buffer1 & Chr$(13)
                EXPID = 0
            Else
                MSComm.Output = CStr(EXPID) & buffer1 & Chr$(13)
                EXPID = (id + 1) Mod 2
            End If
            NOTE.Text = NOTE.Text & "SND:" & Tsend.Text & vbCrLf
            OLDSRE = buffer1
            Tsend.Text = ""
            KeyAscii = 0
            Tsend.Enabled = False
        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 throwmsgc(ByVal msg As String)
    
    id = CInt(Left(msg, 1))
    
    If id = EXPID Then
        EXPID = (id + 1) Mod 2
        MSComm.Output = "ACK" & CStr(EXPID)

        NOTE.Text = NOTE.Text & Right(msg, Len(msg) - 1) & "NEXID:" & Str(EXPID) & vbCrLf
    Else
        NOTE.Text = NOTE.Text & "数据接收出错. 请求重发!" & vbCrLf
        MSComm.Output = "ACK" & CStr(EXPID)
    End If
    
End Sub

Public Sub throwmsgs(ByVal msg As String)
    

    id = CInt(Right(msg, 1))
    
    If id = EXPID Then
        'ID=0第一次建立连接
        Tsend.Enabled = True
        'NOTE.Text = NOTE.Text & "REC:" & data & vbCrLf
        'MSComm.Output = "ACK" & CStr(EXPID)
        'NOTE.Text = NOTE.Text & msg & vbCrLf
    Else
        NOTE.Text = NOTE.Text & "客户接收有问题.重发!" & vbCrLf
        MSComm.Output = CStr(EXPID) & OLDSTR & Chr$(13)
    End If
    
End Sub




















⌨️ 快捷键说明

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