我利用串口发送数据,一次发送一包数据,下位机会对接收到的这一包数据进行校验处理,如果错误则发送#ero\r\n给上位机,要求重发这一包数据,之前发送数据包的的程序如下:
Do While Not EOF(1)  '循环至文件尾
   '读出一行数据放入one_line中
   Line Input #1, one_line
   '得到一行数据,然后串口发送处理
   MSComm1.Output = one_line
   DoEvents
Loopvb控制接收,我把接收到下位机的数据放到b(0)里
Case comEvReceive
b(0) = MSComm1.Input
高手看看我出错后重发是应该加到什么位置比较合适,该怎么判断实现呢,谢谢!!!

解决方案 »

  1.   

    如果#ero\r\n也产生了错误呢?应该是正确的话反馈一个正确包。 而不是错误的时候反馈错误包。。
      

  2.   

    那像你们说的正确之后发一反馈,那样岂不很浪费时间啊,我要发很多包数据呢,如果不浪费时间的话还可以,这样的话该怎么实现呢,在oncomm事件中用简单的if语句可以实现吗,有懂得朋友能不能给段代码参考一下,假设下位机正确接收一包数据后反馈回来$ok\r\n信息,大家看看该怎么处理呢,刚学vb,对它的一些语句很不是很理解,谢谢了
      

  3.   


    'Function Name:    ReadCom(AddressStr As String, MemorType As String, RefValue As String) As String   '读取串口
         'Function:    通过串口读取全部数据
           'Author:    DengyiWolf
             'Date:    20051223
             
    Function ReadCom(AddressStr As String, MemorType As String, RefValue As String) As String   '读取串口
        Dim s_Buffer(9) As Byte, R_Buffer() As Byte
        Dim i As Integer
        Dim ReadbuffTotxt As String
        
        
        i = 0
        '发送数据协议为  55 AA 2A FF 80 00 00 00 00  Xor
        'FF 为地址
        '80 为存储器型号
        '0---0 数据位
        'Xor    校验位
        
        s_Buffer(0) = &H55
        s_Buffer(1) = &HAA
        s_Buffer(2) = &H2A
        s_Buffer(3) = "&H" & AddressStr    '下位机地址      'FF
      
        s_Buffer(4) = "&H" & Trim(MemorType) '存储器型号    '80
     
        s_Buffer(5) = "&H00"
        s_Buffer(6) = "&H00"
        
        '//高位置前,低位置后
        If RefValue > 255 Then
            s_Buffer(7) = "&H" & "0" & Left(Hex(RefValue), 1)
            s_Buffer(8) = "&H" & Right(Hex(RefValue), 2)
        Else
            s_Buffer(7) = "&H00"
            s_Buffer(8) = "&H" & Hex(RefValue)
        End If
        
        s_Buffer(9) = CByte("&H0") & s_Buffer(3) Xor s_Buffer(4) Xor s_Buffer(5) Xor s_Buffer(6) Xor s_Buffer(7) Xor s_Buffer(8)   '校验码
        
        TempStr1 = ""
        For i = 0 To UBound(s_Buffer)
            TempStr1 = TempStr1 & Space(1) & IIf(Len(Hex(s_Buffer(i))) = 1, "0" + Hex(s_Buffer(i)), Hex(s_Buffer(i)))
        Next
        
    ReSend:                  '重发
        MSComm1.InBufferCount = 0
        MSComm1.OutBufferCount = 0
        MSComm1.Output = s_Buffer
        
        Sleep (50)
        
        R_Buffer = MSComm1.Input
        If UBound(R_Buffer) = 13 Then
           For i = 0 To UBound(R_Buffer)
               ReadbuffTotxt = ReadbuffTotxt & IIf(Len(Hex(R_Buffer(i))) = 1, "0" + Hex(R_Buffer(i)), Hex(R_Buffer(i)))
           Next
           ReadCom = ReadbuffTotxt
        Else         '重发,重发超过15次,则超时
           If i < 15 Then
             i = i + 1
             GoTo ReSend   '跳到重发位置
           Else
             ReadCom = 0   '超时
           End If
        End If
    End Function
      

  4.   

    也正在学做串口...楼主的问题也是我想问的 ~_~插问句:dengyiwolf(七星偃月刀)    两台机器好象不能用"  GoTo ReSend   '跳到重发位置  "吧,
    还是不明白上位机得到的 UBound(R_Buffer)值让下位机知道..
      

  5.   

    这个Sleep (50)是不是经串口发送出去数据后等待50ms的意思啊,不要这句不行吗,有什么作用呢,另外我在我的程序里直接用Sleep ()怎么不可以呢,总是出错,我到MSDN Library中去查也查不到,这个sleep函数是不是自己定义的阿?还是怎么用的呢,谢谢
      

  6.   

    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)这是一个api
      

  7.   

    通过上位机发送的一定的数据(按协议发送)  55 AA 2A FF 80 00 00 00 00  XOR
     (XOR校验位)
    下位机接收到数据后,根据同样的协议,返回发送指令的所需数据.上位机得到后,判断是否长度是否足够(是否需要的数据)如果接收数据正确返回正确数据给函数,并返回否则初始化串口,重新发送
    重发次数超出一定数据后,报错,超时