Tagi na forum.

C# 1456 XML 282
SQL 1192 sieci 268
ASP.NET 785 IIS 262
Windows 726 C++ 255
web 608 Html 218
Visual Studio 515 Information Technology 193
SQL Server 425 MSDN 167

pokaż wszystkie tagi na forum

-komunikaty ASCII po RS-232

szefxxx 2011-05-25 22:41:47
0
avatar
 
 
Witam serdecznie,
 
.Piszę prostą aplikację umożliwiającą przesyłanie i odbieranie komunikatów po porcie RS-232.Wysyłanie działa - sprawdziłem snifferem,ale nie działa odbieranie.Moje pytanie,jak zrobić by aplikacja nasłuchiwała w trybie ciągłym komunikatu na porcie RS,tak by treść komunikatu wrzucić do textboxa/richtextboxa??Czy nasłuchiwanie może się odbywać w trybie ciągłym?Czy jeśli jest nasłuchiwanie w trybie ciągłym to nie jest już możliwe wysyłanie komunikatów?Z tego co mi wiadomo to do wysyłania i odbierania są osobne linie na RS,ale nie bawiłem się nigdy portami stąd moje pytanie.Czy do wysyłania i odbierania potrzebne jest użycie wielowątkowości??Patrzyłem na przykład na MSDN dla klasy serialport ale nie rozwiało to moich problemów.Poniżej załączam kod.Prosiłbym o pomoc.
pozdrawiam serrdecznie,
 
Szefxxx:)



[Kod]
Imports System.IO.Ports

Public Class Form1

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
RichTextBox1.Text = ""
End Sub

Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim mySerialPort As New SerialPort
With mySerialPort
.PortName = "COM1"
.BaudRate = 9600
.DataBits = 8
.Parity = Parity.None
.StopBits = StopBits.One
.Handshake = Handshake.None
End With
Try
mySerialPort.Open()
RichTextBox1.Text = mySerialPort.ReadLine
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub

Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim wiad As String
Dim mySerialPort As New SerialPort
With mySerialPort
.PortName = "COM1"
.BaudRate = 9600
.DataBits = 8
.Parity = Parity.None
.StopBits = StopBits.One
.Handshake = Handshake.None
End With
Try
mySerialPort.Open()
RichTextBox1.Text = wiad
mySerialPort.Write(wiad)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try




End Sub
End Class




tagi: MSDN


szogun.krepa  2011-05-26 06:06:17 #1
0
avatar
 
 
Problemem jst fakt ze metoda readline blokuje watek w ktorym jest wykonywana dopuki nie nadejdzie sekwencja konca linii ze strumienia. Powinienes odczytywanie umiescic w innym watku a po odczytaniu uzywac metody invoke do umieszczenia przeczytanego tekstu w kontrolce.--if (PomoglCi)
{
Click("Pomógł mi");
}
Strona szoguna

if (PomoglCi)

{

Click("Pomógł mi");

}

Strona szoguna

szefxxx  2011-05-26 23:15:32 #1.1
0
avatar
 
 
Dzięki za odpowiedź:)Nie bardzo wiem jak się odnieść wątkiem i przez funkcję invoke do tego RichTextboxa w kontekscie wysyłania.Czytałem na MSDN,ale nie zrozumiałem tego.Czy mógłbym  prosić o jakiś przykład w tym kontekscie jak to rozwiązać??

szogun.krepa  2011-05-27 06:38:58 #1.1.1
0
avatar
 
 
Zanim napiszę jakąkolwiek linijkę kodu. To czy mógłbyś mi powiedzieć dlaczego osobno otwierasz i zamykasz port COM dla każdej pojedyńczej operacji? Nie lepiej otworzyć go na Load a zamknąć przy zamknięciu okna?--if (PomoglCi)
{
Click("Pomógł mi");
}
Strona szoguna

if (PomoglCi)

{

Click("Pomógł mi");

}

Strona szoguna

szefxxx  2011-05-27 08:43:46 #1.1.1.1
0
avatar
 
 
Dzięki za odpowiedź:)Tak masz zdecydowanie rację,nie optymalnie to wygladało.W sumie zrobiłem nieco inaczej.Przed korzystaniem "z akcji" przycisków,zadeklarowałem sobie obiekt i jego właściwości co do połączenia i teraz przy każdej funkcjonalności korzystam z tego obiektu.Próbowałem z tymi wątkami  i przez invoke ale mi coś nie wychodzi.
Poniżej zamieszczam nieco zoptymalizowany listing:
Prosiłbym o pomoc;)



[Kod]
Imports System
Imports System.IO
Imports System.IO.Ports
Imports System.Threading



Public Class Form1
Private mySerialPort As New SerialPort
Private watek As Thread
Public TextBox As RichTextBox
Private Sub CommPortSetup()
With mySerialPort
.PortName = "COM1"
.BaudRate = 9600
.DataBits = 8
.Parity = Parity.None
.StopBits = StopBits.One
.Handshake = Handshake.None
End With
End Sub
Private Sub mySerialPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
Dim n As Integer = mySerialPort.BytesToRead
Dim comBuffer As Byte() = New Byte(n - 1) {}
mySerialPort.Read(comBuffer, 0, n)
Console.WriteLine(comBuffer(0))
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
RichTextBox1.Text = " "
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'wysylanie
Try
mySerialPort.Open()
mySerialPort.Write(RichTextBox1.Text)
Catch ex As Exception
MsgBox(ex.Message)
End Try
mySerialPort.Close()


End Sub
Public Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
'Odbieranie
'Dim wiadomosc As String

Try
mySerialPort.Open()


Catch ex As Exception
MsgBox(ex.Message)
End Try

mySerialPort.Close()
End Sub



Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHandler mySerialPort.DataReceived, AddressOf mySerialPort_DataReceived

End Sub
End Class





szogun.krepa  2011-05-27 21:57:04 #1.1.1.1.1
0
avatar
 
 
Skorzystałeś ze zdarzenia DataReceived dzięki czemu nie musisz tworzyć  wątku. Musisz za to wykorzystać Invoke ponieważ "The DataReceived event is raised on a secondary thread when data is received from the SerialPort object.".
 
Nie przywykłem do pisania w VB ale ogólnie w metodzie mySerialPort_DataReceived musisz wywołać metodę Form1.Invoke przekazując jej referencję do metody która odczytany fragment tekstu umieści w TextBoxie.
 
 
 --if (PomoglCi)
{
Click("Pomógł mi");
}
Strona szoguna

if (PomoglCi)

{

Click("Pomógł mi");

}

Strona szoguna

Udziel odpowiedzi

avatar
Treść wpisu:

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.

Idź na górę strony