hankypanky
New member
- Joined
- Jan 24, 2013
- Messages
- 1
- Programming Experience
- 10+
Hello everyone!
I am currently writing a console application that should communicate with a digital display that will show different kind of messages.
I have used a software called 'Putty' to try this communication the manual way and it works really great. You put in an IP, a Port and then you simply type in your message and press enter. The message is displayed directly.
Now to the tricky part. I have tried to implement the same functionality using the TcpClient and NetworkStream objects in .Net, and I think that I have succeeded in some way, but not completely.
The problem that I have is that the messages doesn't always end up on the display directly; i have to send them a couple of times and suddenly the appear. As I understand it, it might have something to do
with the size of the package that I am sending. It might be to small, and due to that it isn't sent until it is large enough. But that is just a guess of course...
My solution at the moment is to send the package ten times in the same update, it always works... But that solution sucks.
Here is my code:
'<Diagnostics.DebuggerHidden()> _
Public Function SendMessage(Carriers As List(Of CarrierDB), Logs As List(Of LogDB)) As Boolean
Dim ret As Boolean
Try
If PrepareMessage(Carriers, Logs) Then
Dim MaxChars As Integer = 83 - 3
Dim StaticChars As Integer = 5 + 1
' StartString
Dim startString As String = ""
If Message = Config.DisplayStaticEnglish Then
'
startString = Chr(27) & "11A0"
'
Else
'
startString = Chr(27) & "11A5"
'
End If
' Message
If Message.Length > (MaxChars - StaticChars) Then
'
Message = Message.Substring(0, MaxChars - StaticChars) & "..."
'
End If
' SendString1
Dim sendString1 As String = startString & Message
' SendString2
Dim sendString2 As String = Chr(13) & Chr(10)
' Client
Client = New TcpClient
Client.Connect(IP, Port)
Client.NoDelay = True
Stream = Client.GetStream
' Write
If stream.CanWrite Then
'
Dim WriteBuffer1() As Byte = GetWriteBuffer(Stream, sendString1)
Dim WriteBuffer2() As Byte = GetWriteBuffer(Stream, sendString2)
For i As Integer = 0 To 0
'
Stream.Write(WriteBuffer1, 0, WriteBuffer1.Length)
Stream.Write(WriteBuffer2, 0, WriteBuffer2.Length)
'
Next
ret = True
'
End If
'
End If
Catch ex As Exception
'
ret = False
'
Finally
'
Client.Close()
Client = Nothing
Stream.Close()
Stream = Nothing
'
End Try
Return ret
'
End Function
Private Function GetWriteBuffer(stream As NetworkStream, sendString As String) As Byte()
'
Dim writeBuffer(sendString.Length - 1) As Byte
Try
If stream.CanWrite Then
Dim i As Integer = 0
For i = 0 To sendString.Length - 1
'
Dim c As Char = sendString.Chars(i)
Select Case c
Case "Å"
writeBuffer(i) = 93
Case "å"
writeBuffer(i) = 125
Case "Ä"
writeBuffer(i) = 91
Case "ä"
writeBuffer(i) = 123
Case "Ö"
writeBuffer(i) = 92
Case "ö"
writeBuffer(i) = 124
Case Else
writeBuffer(i) = Asc(c)
End Select
'
Next
End If
'
Catch ex As Exception
'
'
End Try
Return writeBuffer
'
End Function
Anys ideas?
Thanks!
/Henrik
I am currently writing a console application that should communicate with a digital display that will show different kind of messages.
I have used a software called 'Putty' to try this communication the manual way and it works really great. You put in an IP, a Port and then you simply type in your message and press enter. The message is displayed directly.
Now to the tricky part. I have tried to implement the same functionality using the TcpClient and NetworkStream objects in .Net, and I think that I have succeeded in some way, but not completely.
The problem that I have is that the messages doesn't always end up on the display directly; i have to send them a couple of times and suddenly the appear. As I understand it, it might have something to do
with the size of the package that I am sending. It might be to small, and due to that it isn't sent until it is large enough. But that is just a guess of course...
My solution at the moment is to send the package ten times in the same update, it always works... But that solution sucks.
Here is my code:
'<Diagnostics.DebuggerHidden()> _
Public Function SendMessage(Carriers As List(Of CarrierDB), Logs As List(Of LogDB)) As Boolean
Dim ret As Boolean
Try
If PrepareMessage(Carriers, Logs) Then
Dim MaxChars As Integer = 83 - 3
Dim StaticChars As Integer = 5 + 1
' StartString
Dim startString As String = ""
If Message = Config.DisplayStaticEnglish Then
'
startString = Chr(27) & "11A0"
'
Else
'
startString = Chr(27) & "11A5"
'
End If
' Message
If Message.Length > (MaxChars - StaticChars) Then
'
Message = Message.Substring(0, MaxChars - StaticChars) & "..."
'
End If
' SendString1
Dim sendString1 As String = startString & Message
' SendString2
Dim sendString2 As String = Chr(13) & Chr(10)
' Client
Client = New TcpClient
Client.Connect(IP, Port)
Client.NoDelay = True
Stream = Client.GetStream
' Write
If stream.CanWrite Then
'
Dim WriteBuffer1() As Byte = GetWriteBuffer(Stream, sendString1)
Dim WriteBuffer2() As Byte = GetWriteBuffer(Stream, sendString2)
For i As Integer = 0 To 0
'
Stream.Write(WriteBuffer1, 0, WriteBuffer1.Length)
Stream.Write(WriteBuffer2, 0, WriteBuffer2.Length)
'
Next
ret = True
'
End If
'
End If
Catch ex As Exception
'
ret = False
'
Finally
'
Client.Close()
Client = Nothing
Stream.Close()
Stream = Nothing
'
End Try
Return ret
'
End Function
Private Function GetWriteBuffer(stream As NetworkStream, sendString As String) As Byte()
'
Dim writeBuffer(sendString.Length - 1) As Byte
Try
If stream.CanWrite Then
Dim i As Integer = 0
For i = 0 To sendString.Length - 1
'
Dim c As Char = sendString.Chars(i)
Select Case c
Case "Å"
writeBuffer(i) = 93
Case "å"
writeBuffer(i) = 125
Case "Ä"
writeBuffer(i) = 91
Case "ä"
writeBuffer(i) = 123
Case "Ö"
writeBuffer(i) = 92
Case "ö"
writeBuffer(i) = 124
Case Else
writeBuffer(i) = Asc(c)
End Select
'
Next
End If
'
Catch ex As Exception
'
'
End Try
Return writeBuffer
'
End Function
Anys ideas?
Thanks!
/Henrik