Dear 版主:
哥们我在调试一个Philips的点灯板(输入380V, DC;输出2300V,AC)通过串口进行控制。
我一直使用Serial Port控件,但是我这几天贼郁闷。问题如下:
这个板子你通过串口发命令给它的时候,它会通过串口返回值。
比如发送70  返回70
发送F0 返回 F0
发送F1 返回F1
等等等但是我现在遇到的问题是:
我放了两个按钮,一个按钮发送70,一个按钮发F0;理论上我发70的时候我会收到70,我发F0的时候会收到F0;但是现在是这样子的:
第一次点70按钮,没任何返回值;第二次点 接收到70
然后点F0,结果收到70,也就是上次的数据,必须再点一次才能收到F0这个怎么回事呢??代码:
\\\\\\\\\ 70必须先发送\\\\\\\\\\\
  
  
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        SerialPortforLampDriver.DiscardOutBuffer()
        MessageBox.Show(SendCMDtoDriver("70"))
    End Sub    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        SerialPortforLampDriver.DiscardOutBuffer()
        MessageBox.Show(SendCMDtoDriver("f0"))
    End Sub
Public Function SendCMDtoDriver(ByVal strCMDSend As String)        Dim bytHex() As Byte
        Dim indata As String
        Dim byteToRead As Int16 = frmMain.SerialPortforLampDriver.BytesToRead
        Dim ch(byteToRead) As Byte
        Dim bytesRead As Int16 = 0
        ReDim bytHex((Len(strCMDSend) \ 2) - 1)
        Dim i As Integer        indata = ""        For i = 1 To Len(strCMDSend) Step 2
            bytHex((i - 1) / 2) = Val("&H" & Mid(strCMDSend, i, 2))
        Next
        frmMain.SerialPortforLampDriver.Write(bytHex, 0, bytHex.Length)
        frmMain.SerialPortforLampDriver.DiscardOutBuffer()
        Sleep(200)        bytesRead = frmMain.SerialPortforLampDriver.Read(ch, 0, byteToRead)
        If bytesRead > 0 Then
            For ii As Int16 = 0 To bytesRead - 1
                indata = indata & DecToHex(ch(ii))
            Next
            Return indata
        Else        End If        frmMain.SerialPortforLampDriver.DiscardOutBuffer()
    End FunctionSerial port

解决方案 »

  1.   

    在SendCMDtoDriver内部单步调试下,问题应该不难发现。
      

  2.   


    OK,等会尝试下。
    我现在没有办法了,用MSCOMM,竟然OK了。
    为啥子Serial Port 控件就不可以呢
      

  3.   

    在SendCMDtoDriver内部单步调试下
      

  4.   

    OK  结案了!100分给大家了,谢谢了。红色挪到Sleep(200)后即可。
    因为每发送指令前读,所以是空的,等第二次按的时候,循环才开始

    这么低级的错误![code=Visual Basic 2008]
    Public Function SendCMDtoDriver(ByVal strCMDSend As String)           Dim bytHex() As Byte        Dim indata As String        Dim byteToRead As Int16 = frmMain.SerialPortforLampDriver.BytesToRead         Dim ch(byteToRead) As Byte        Dim bytesRead As Int16 = 0         ReDim bytHex((Len(strCMDSend) \ 2) - 1)         Dim i As Integer          indata = ""          For i = 1 To Len(strCMDSend) Step 2             bytHex((i - 1) / 2) = Val("&H" & Mid(strCMDSend, i, 2))         Next        frmMain.SerialPortforLampDriver.Write(bytHex, 0, bytHex.Length)         frmMain.SerialPortforLampDriver.DiscardOutBuffer()         Sleep(200)           bytesRead = frmMain.SerialPortforLampDriver.Read(ch, 0, byteToRead)         If bytesRead > 0 Then            For ii As Int16 = 0 To bytesRead - 1                 indata = indata & DecToHex(ch(ii))             Next            Return indata         Else          End If          frmMain.SerialPortforLampDriver.DiscardOutBuffer()     End Function 
    [/code]
      

  5.   


    Public Function SendCMDtoDriver(ByVal strCMDSend As String)           Dim bytHex() As Byte        Dim indata As String        Dim byteToRead As Int16 = frmMain.SerialPortforLampDriver.BytesToRead         Dim ch(byteToRead) As Byte        Dim bytesRead As Int16 = 0         ReDim bytHex((Len(strCMDSend) \ 2) - 1)         Dim i As Integer          indata = ""          For i = 1 To Len(strCMDSend) Step 2             bytHex((i - 1) / 2) = Val("&H" & Mid(strCMDSend, i, 2))         Next        frmMain.SerialPortforLampDriver.Write(bytHex, 0, bytHex.Length)         frmMain.SerialPortforLampDriver.DiscardOutBuffer()         Sleep(200)           bytesRead = frmMain.SerialPortforLampDriver.Read(ch, 0, byteToRead)         If bytesRead > 0 Then            For ii As Int16 = 0 To bytesRead - 1                 indata = indata & DecToHex(ch(ii))             Next            Return indata         Else          End If          frmMain.SerialPortforLampDriver.DiscardOutBuffer()     End Function