在做一个串口通讯的exe,PC端先循环发送握手信号&H20,一旦检测到握手成功,就发送命令信号&H2,然后再进行下一步操作。问题是: 
      在发送命令信号&H2时,根据打印的信息,下位机接收到的仍然是握手信号&H20,为什么会这样? 
      后来尝试在检测到握手成功后清空发送缓冲和接收缓冲,再发送命令信号,结果得不到改观; 
      而后又尝试在检测到握手成功后清空发送缓冲和接收缓冲、关闭串口,再打开串口,再执行清空发送缓冲和接收缓冲,再发送命令信号,结果仍得 
      不到改观。代码片断如下: 
      Do 
        MSComm1.OutBufferCount = 0 
        MSComm1.InBufferCount = 0 
        sendbyte (HS_CODE)                        '&H20 
        If IsRxDataReady(1, 0) = True Then        ' 
            ReDim returnData(1) 
            returnData = ReadRxData(10) 
            If returnData(0) Then                'Handshak is OK ? 
                Exit Do 
            End If 
        End If 
    Loop     MSComm1.OutBufferCount = 0            'clean buffer 
    MSComm1.InBufferCount = 0 
    MSComm1.PortOpen = False              'close com port     OpenCommPort                          'Open com port 
    MSComm1.OutBufferCount = 0            'clean buffer 
    MSComm1.InBufferCount = 0 
    Do 
        MSComm1.OutBufferCount = 0 
        MSComm1.InBufferCount = 0 
        sendbyte (HS_COMMAND)              '&H2 
        If IsRxDataReady(1, 0) = True Then 
            ReDim returnData(1) 
            returnData = ReadRxData(1) 
            If returnData(0) = CCHR Then      'Command is OK ? 
                Exit Do 
            End If 
        End If 
    Loop 各位VB前辈,多多指教,谢谢 
如果可以的话,可以QQ指导:36039261,或E-mail:[email protected] 因为刚注册,分不多 
请赐教,不胜感激

解决方案 »

  1.   

    首先你要确定你发送的握手信号下位机真的收到了,通过你的代码片段来看,你只要returnData(0)非空就认为下位机已经收到了,其实不一定,你可能首次使用有效,当第二次在使用时,returnData(0)本身可能就非空,所以,不管下位机是否收到握手信号,程序都会Exit Do,所以你每次执行完 If returnData(0) Then  以后,要把returnData(0)清空。估计问题就解决了
      

  2.   

    fangzheng2008,首先非常感谢你。可是,
    returnData(0)清空是这样吗:returnData = Empty
    这样试了,结果依旧。而且,我通过打印信息,已经确认握手成功,只待进行命令操作了,关键问题是:在接下来的数据发送中,不管我发送啥数据,总得到的是一样的结果。请问还有更贴切的建议吗?
    谢谢,在线企待
      

  3.   

    清空是这样吧returnData  = ""
    还有你在        sendbyte (HS_COMMAND)              '&H2 
    这句设个断点,单步调试一下
      

  4.   

    wang19847277,谢谢你的建议,已经试过,效果依旧
    我想,如果按照逻辑分析的话,我发了一个数据后,清空了缓冲区,再发一个新数据,不应该出现这样的问题啊
    我分析过是否是定时器的问题,但在命令成功之前是没有使能定时器的对了,是不是这个循环有毛病:
    "
          Do 
            MSComm1.OutBufferCount = 0 
            MSComm1.InBufferCount = 0 
            sendbyte (HS_CODE)                        '&H20 
            If IsRxDataReady(1, 0) = True Then        ' 
                ReDim returnData(1) 
                returnData = ReadRxData(10) 
                If returnData(0) Then                'Handshak is OK ? 
                    Exit Do 
                End If 
            End If 
        Loop
    "
    上位机在接受到正确数据returnData之前已经发了NN多的&H20,也就是说下位机的接受缓冲区中已经有了NN多的&H20,这样的话,在NNN个
    "
        Do 
            MSComm1.OutBufferCount = 0 
            MSComm1.InBufferCount = 0 
            sendbyte (HS_COMMAND)              '&H2 
            If IsRxDataReady(1, 0) = True Then 
                ReDim returnData(1) 
                returnData = ReadRxData(1) 
                If returnData(0) = CCHR Then      'Command is OK ? 
                    Exit Do 
                End If 
            End If 
        Loop 
    "
    操作后,下位机应该也有机会收到&H2的呀。那时候好像PC机都快瘫了...
      

  5.   

    code修改如下:

        Do                                            'Just handshaking
            If IsRxDataReady(1, 0) = True Then
                ReDim returnData(1)
                returnData = ReadRxData(10)
                If returnData(0) Then
                    Exit Do
                End If
                returnData = ""
            End If
        Loop    MSComm1.OutBufferCount = 0
        MSComm1.InBufferCount = 0
        sendbyte (HS_CODE)                          'Send &H20
        
        returnData = ""
        MSComm1.PortOpen = False
        MSComm1.OutBufferCount = 0
        MSComm1.InBufferCount = 0
        OpenCommPort
        
        Do
            MSComm1.OutBufferCount = 0
            MSComm1.InBufferCount = 0
            sendbyte (HS_COMMAND)                           'Send &H2
            If IsRxDataReady(10, 0) = True Then
                ReDim returnData(1)
                returnData = ReadRxData(1)
                If returnData(0) = CCHR Then
                    Exit Do
                End If
                returnData = ""
            End If
        Loop

    问题如旧,肯请高手指点。多谢