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
哥们我在调试一个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
OK,等会尝试下。
我现在没有办法了,用MSCOMM,竟然OK了。
为啥子Serial Port 控件就不可以呢
因为每发送指令前读,所以是空的,等第二次按的时候,循环才开始
靠
这么低级的错误![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]
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