如何解决.NET Serial over TCP 类
首先我是自闭症,这是我的第一篇文章,所以拜托了。另外,我不太确定如何表达这个问题,所以我会描述一下场景,也许你可以帮助我。
我有一个串行设备服务器(Moxa Nport DE308)。它有 8 个 RS232 级端口,我将它配置为 TCP 服务器。 TCP 端口匹配从 4001 到 4008 的实际端口。但没有 SDK,没有库。
我们有各种各样的设备与之相连,从屏幕到空调。所以我用套接字给它写了一个类,然后我在另一个类中为每个工具包引用它。
虽然它有效,但我有一个基本问题。而且我不知道该怎么说..我会描述我所做的(对此感到抱歉)让我们一起去空调课
这是会说话的班级
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Public Class MoxaSerialPort
Private Client As TcpClient
Private DataStream As NetworkStream
Private Nlock As System.Object = New System.Object
Public Property NoResponse As Boolean = False
Public Property Delay As Integer = 180
Private Port As Integer
Public Sub Open(ByVal MoxaIPAddress As String,ByVal MoxaTCPPort As Integer)
If Ping(MoxaIPAddress) Then
Client = New TcpClient(MoxaIPAddress,MoxaTCPPort)
DataStream = Client.GetStream
Port = MoxaTCPPort
Else
Throw New IO.IOException("Destination Host Unavailable " & MoxaIPAddress)
End If
End Sub
Public Sub Close()
If DataStream IsNot Nothing Then
DataStream.Flush()
DataStream.Close()
DataStream.Dispose()
DataStream = Nothing
End If
If Client IsNot Nothing Then
If Client.Connected Then
Client.Close()
Client.Dispose()
End If
Client = Nothing
End If
End Sub
Private Function Ping(address As String) As Boolean
Return My.Computer.Network.Ping(address)
End Function
Public Function ParseCommand(Command As Byte(),Optional Retries As Integer = 3) As Byte()
Dim ReadBuffer() As Byte,Attempts As Integer
If (Client IsNot Nothing) AndAlso Client.Connected Then
Do
SyncLock (Nlock)
DataStream.Write(Command,Command.Count)
DataStream.Flush()
Thread.Sleep(Delay)
If DataStream.CanRead AndAlso Client.Available > 0 Then
ReDim ReadBuffer(Client.Available)
DataStream.Read(ReadBuffer,Client.Available)
DataStream.Flush()
Return ReadBuffer
End If
End SyncLock
If NoResponse = True Then Return Nothing 'not expecting or don't care about response.
Thread.Sleep(750)
Attempts = Attempts + 1
Debug.Print("Attempt " & Attempts.ToString)
Loop While DataStream.CanWrite AndAlso Attempts < Retries
Throw New IO.IOException("No response after {0} attempts.",Attempts)
Else
Throw New IO.IOException("Connection failed.")
End If
Return Nothing
End Function
Public ReadOnly Property Connected As Boolean
Get
If Client IsNot Nothing Then Return Client.Connected
Return False
End Get
End Property
End Class
我正在尝试在单独的类中为连接的每一位齿轮使用这个类,例如。空调。
但是仅仅检查每个 x 并不好。 我是否在课堂上放了一个计时器并让它不断更新。? 我是否执行上述操作,引发事件,然后更新表单。? 我可以汇集多少次。
这是空调的表格更新..
Imports System.Threading
Public Class AirconTab
Private Shared AirconUpdateTimer As Timer
Shared Sub TimerInit()
Dim AirconCallBack As New TimerCallback(AddressOf AirconTab.UpdateAirconForm)
AirconUpdateTimer = New Timer(AirconCallBack,Nothing,Timeout.Infinite)
End Sub
Shared Sub UpdateAirconForm()
Try
If Aircon.ClientActive Then
Update()
Else
TimerStop()
Dim SelectedOption As Integer = MsgBox("Connection to 10.10.10.12:4002 has been lost. Reconnect..?",vbOKCancel Or vbExclamation,"AirconTab.UpdateAirconForm")
If SelectedOption = MsgBoxResult.Ok AndAlso Aircon.Connect = True Then TimerStart()
End If
Catch ex As Exception
Debug.Print(ex.Message)
End Try
End Sub
Private Shared Sub Update()
If frmMain.MainFormInstance IsNot Nothing Then
With frmMain.MainFormInstance
If .InvokeRequired Then
.Invoke(New MethodInvoker(AddressOf Update))
Else
Try
Dim Registers As Integer() = Aircon.ReadAllRegisters()
Dim RoomTemps As Double() = PoKeys.GetTemperatures
If Aircon.SelectedRoom = Aircon.Rooms.EastWing Then 'we need to dump the netduino names for room numbers!
Dim ActualTemp As Double = Math.Round(RoomTemps(PoKeys.Sensors.Eastwing),1)
.lblActualTemp.Text = ActualTemp.ToString("N1")
ElseIf Aircon.SelectedRoom = Aircon.Rooms.WestWing Then
Dim ActualTemp As Double = Math.Round(RoomTemps(PoKeys.Sensors.Westwing),1)
.lblActualTemp.Text = ActualTemp.ToString("N1")
End If
Dim PowerState As Boolean = CBool(Registers(Aircon.Registers.Power))
If PowerState = True Then
.cmdAirconPower.Text = "ON"
ElseIf PowerState = False Then
.cmdAirconPower.Text = "OFF"
End If
'.lblFrontRun.Visible = NETDUINO.EastAirconRunning
'.lblBedRun.Visible = NETDUINO.WestAirconRunning
.lblSetpoint.Text = Registers(Aircon.Registers.SetPoint).ToString
Dim ExternalRef As Integer = Registers(Aircon.Registers.ExtTempRef)
If ExternalRef <> -32768 And Aircon.UseExtTempRef(Aircon.SelectedRoom) = True Then
.lblReturnPath.Text = ExternalRef.ToString
.lblRP.Text = "Reference Temp"
.lblRSoC.Visible = True
.lblOffset.Text = Aircon.Offset(Aircon.SelectedRoom).ToString
Else
'.lblReturnPath.Text = Registers(Aircon.Registers.ReturnAir).ToString
.lblReturnPath.Text = String.Empty
.lblRP.Text = String.Empty 'put these controls in a group and hide them all.
.lblRSoC.Visible = False
.lblOffset.Text = String.Empty
End If
Dim FanSpeedRadio As RadioButton
FanSpeedRadio = CType(.grpFanSpeed.Controls("radFanSpeed" & Registers(Aircon.Registers.FanSpeed).ToString),RadioButton)
FanSpeedRadio.Checked = True
Dim OpModeRadio As RadioButton
OpModeRadio = CType(.grpOperatingMode.Controls("radOpMode" & Registers(Aircon.Registers.Mode).ToString),RadioButton)
OpModeRadio.Checked = True
.ChkEconomyMode.Checked = CBool(Registers(Aircon.Registers.EconomyMode))
.chkExternalSensor.Checked = Aircon.UseExtTempRef(Aircon.SelectedRoom)
.lblSetpointMax.Text = Registers(Aircon.Registers.SetPointMax).ToString
.lblSetpointMin.Text = Registers(Aircon.Registers.SetPointMin).ToString
Catch ex As Exception
Debug.Print(ex.ToString)
End Try
End If
End With
End If
End Sub
Shared Sub TimerStop()
If AirconUpdateTimer IsNot Nothing Then AirconUpdateTimer.Change(Timeout.Infinite,Timeout.Infinite)
End Sub
Shared Sub TimerStart()
If AirconUpdateTimer IsNot Nothing Then AirconUpdateTimer.Change(0,AIRCON_FORM_UPDATE_INT)
End Sub
Shared Sub TimerDispose()
If AirconUpdateTimer IsNot Nothing Then
AirconUpdateTimer.Dispose()
AirconUpdateTimer = Nothing
End If
End Sub
End Class
我希望您了解我正在努力实现的目标,我知道现在看起来很糟糕。但我学得很快! :)
新年快乐!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。