我正在使用串行端口连接到秤并在地磅 Windows 应用程序中获取秤读数。现在我的编码方式是,当我单击按钮打开并开始接收读数时,它开始很好地输出读数,我使用这个代码
Private Sub cmdOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOpen.Click
comm.Parity = cboParity.Text
comm.StopBits = cboStop.Text
comm.DataBits = cboData.Text
comm.BaudRate = cboBaud.Text
comm.DisplayWindow = rtbDisplay
comm.OpenPort()
cmdOpen.Enabled = True
cmdClose.Enabled = True
cmdSend.Enabled = True
End Sub
Public Function OpenPort() As Boolean
Try
'first check if the port is already open
'if its open then close it
If comPort.IsOpen = True Then
comPort.Close()
End If
'set the properties of our SerialPort Object
comPort.BaudRate = Integer.Parse(_baudRate)
'BaudRate
comPort.DataBits = Integer.Parse(_dataBits)
'DataBits
comPort.StopBits = DirectCast([Enum].Parse(GetType(StopBits), _stopBits), StopBits)
'StopBits
comPort.Parity = DirectCast([Enum].Parse(GetType(Parity), _parity), Parity)
'Parity
comPort.PortName = _portName
'PortName
'now open the port
comPort.Open()
'display message
_type = MessageType.Normal
_msg = "Port opened at " + DateTime.Now + "" + Environment.NewLine + ""
'_msg = Environment.NewLine
DisplayData(_type, _msg)
'return true
Return True
Catch ex As Exception
DisplayData(MessageType.[Error], ex.Message)
Return False
End Try
End Function
Public Sub ClosePort()
If comPort.IsOpen Then
_msg = "Port closed at " + DateTime.Now + "" + Environment.NewLine + ""
_type = MessageType.Normal
DisplayData(_type, _msg)
comPort.Close()
End If
End Sub
Private Sub comPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
'determine the mode the user selected (binary/string)
Select Case CurrentTransmissionType
Case TransmissionType.Text
'user chose string
'read data waiting in the buffer
Dim msg As String = comPort.ReadExisting()
'display the data to the user
_type = MessageType.Incoming
_msg = msg
DisplayData(MessageType.Incoming, msg + "" + Environment.NewLine + "")
Exit Select
Case TransmissionType.Hex
'user chose binary
'retrieve number of bytes in the buffer
Dim bytes As Integer = comPort.BytesToRead
'create a byte array to hold the awaiting data
Dim comBuffer As Byte() = New Byte(bytes - 1) {}
'read the data and store it
comPort.Read(comBuffer, 0, bytes)
'display the data to the user
_type = MessageType.Incoming
_msg = ByteToHex(comBuffer) + "" + Environment.NewLine + ""
DisplayData(MessageType.Incoming, ByteToHex(comBuffer) + "" + Environment.NewLine + "")
Exit Select
Case Else
'read data waiting in the buffer
Dim str As String = comPort.ReadExisting()
'display the data to the user
_type = MessageType.Incoming
_msg = str + "" + Environment.NewLine + ""
DisplayData(MessageType.Incoming, str + "" + Environment.NewLine + "")
Exit Select
End Select
End Sub
Private Sub MonitorSP_DataReceived(ByVal sender As Object, ByVal e As IO.Ports.SerialDataReceivedEventArgs)
Dim SP As IO.Ports.SerialPort = DirectCast(sender, IO.Ports.SerialPort)
Dim Data As String = SP.ReadLine
'Remember this is in a background thread so you can not update the UI from here without using Me.Invoke
End Sub
Private Sub CloseSP()
For Each selSP As IO.Ports.SerialPort In MonitorSP
selSP.Close()
Next
MonitorSP.Clear()
End Sub
Private Sub cmdClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdClose.Click
'Comm is an instance of the class that contains the methods I showed above like Datareceived and so forth
comm.ClosePort()
comm.ClosePort()
'SetControlState()
SetDefaults()
End Sub
现在,当我尝试关闭并重新打开端口时,挑战出现了,当我关闭端口并等待几分钟,然后再次尝试重新打开端口时它不起作用(读数未显示在秤上)。但是当我关闭端口退出表格然后回到表格然后打开端口然后读数出现。我的问题是如何打开和关闭端口并再次打开它而无需关闭表单或重新启动应用程序。