Zobacz poprzedni temat :: Zobacz nastêpny temat |
Autor |
Wiadomo¶æ |
GregoryyyR
Do³±czy³: 03 Pa¼ 2012 Posty: 32
|
Wys³any: Czw Maj 23, 2019 1:19 pm OP Temat postu: Odczyt danych z portu RS232 |
|
|
Mam problem z odczytem danych z portu RS 232. Wysy?anie danych do portu dzia?a bez problemu jednak przy odbieraniu nic mi nie odczytuje. Parametry portu s? poprawne poniewa? przy u?yciu innych programów odczytuj? dane z portu. Poni?ej zamieszczam kod. Port otwieram drugim przyciskiem wi?c jest na pewno otwarty.
Kod: |   
  Private Sub btnCzytaj_Click(sender As Object, e As EventArgs) Handles btnCzytaj.Click
  
  Try
  
  SerialPort1.ReadTimeout = 10000
  Do
  
  Dim Incoming As String = SerialPort1.ReadLine
  If Incoming Is Nothing Then
  Exit Do
  Else
  lblDane.Text = SerialPort1.ReadLine
  End If
  Loop
  Catch ex As TimeoutException
  lblDane.Text = "Error: Serial Port read timed out."
  Finally
  If SerialPort1 IsNot Nothing Then SerialPort1.Close()
  End Try
  
  
  End Sub
  
|
Mia?em b??d w programie nadaj?cym dane do portu poniewa? do ci?gu znaków nie doda?em ko?ca linii. Jak mog? odczyta? dane z portu je?eli urz?dzenie nie przesy?a znaku ko?ca linii, metoda Kod: |  ReadLine
|
wtedy nie dzia?a, a z pozosta?ych dost?pnych dzia?a tylko Kod: |  ReadChar
|
[/code] |
|
Powrót do góry |
|
 |
|
arturooo3 Moderator
Do³±czy³: 04 Lis 2006 Posty: 1190 Sk±d: Kraków
|
Wys³any: Pon Maj 27, 2019 9:38 am Temat postu: |
|
|
Nie wiem czy du?o pomog?, poniewa? w VB nie siedz? ju? od dobrych kilku lat, ale generalnie w przypadku RS232 dobr? metod? jest czytanie znak po znaku i sk?adanie wiadomo?ci r?cznie. W razie otrzymania jednego ze znaków kontrolnych b?dziesz móg? odpowiednio zareagowa?.
Je?eli urz?dzenie z którym rozmawiasz nie przesy?a znaku line feed, carriege return lub ani jednego z nich to mo?e w inny sposób informuje o ko?cu wiadomo?ci? https://en.wikipedia.org/wiki/Control_character |
|
Powrót do góry |
|
 |
GregoryyyR
Do³±czy³: 03 Pa¼ 2012 Posty: 32
|
Wys³any: Wto Maj 28, 2019 12:27 pm OP Temat postu: |
|
|
Wydaje mi si? ?e nie nadaje znaku ko?ca linii poniewa? w ka?dym programie jak odbieram dane z urz?dzenia to nowa paczka nie jest wstawiana w nowej linii ani za danymi poprzednimi tylko w miejsce ostatniej danej z poprzedniego ci?gu. Zawsze ostatnia dan? z paczki trac?. W Lab View napisa?em program, w którym do ka?dej paczki dodaje znak nowej linii i wtedy dane wygl?daj? tak jak powinny. Dodatkowo wg producenta ka?da dana w paczce jest rozdzielona tabulatorem, w rzeczywisto?ci s? to spacje i miedzy pierwsz? i drug? dan? jest 6 spacji, miedzy drug? i trzeci? 5, mi?dzy trzeci? i czwart? 7 i mi?dzy ka?d? kolejn? 4. |
|
Powrót do góry |
|
 |
GregoryyyR
Do³±czy³: 03 Pa¼ 2012 Posty: 32
|
Wys³any: Pon Cze 03, 2019 9:29 pm OP Temat postu: |
|
|
Mam jeszcze jeden problem. Odczyt danych z portu RS232 realizuj? w zdarzeniu "Click" przycisku 1. Potrzebuj? drugim przyciskiem zako?czy? odczyt danych z portu, ale nie mog? tego zrobi? dopóki trwa operacja w pierwszym. Czy jest mo?liwo?? odwo?ania si? do zdarzenia "Click" przycisku drugiego w przycisku pierwszym, czy bardziej poprawny sposób to wykorzystanie w?tków? |
|
Powrót do góry |
|
 |
samolot
Do³±czy³: 26 Sty 2006 Posty: 8376 Sk±d: Toru?
|
Wys³any: Pon Cze 03, 2019 9:51 pm Temat postu: |
|
|
Przyk?ad:
Kod: |  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
 
 'Tu jest kod zdarzenia Click tego przycisku czyli Buttona1
 'a po jego zako?czeniu mo?esz z poziomu tego zdarzenia wywo?a? zdarzenie Click Buttona2:
 Button2.PerformClick()
 
 End Sub
|
_________________ Nie zadawaj bezcelowych pyta? / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie |
|
Powrót do góry |
|
 |
GregoryyyR
Do³±czy³: 03 Pa¼ 2012 Posty: 32
|
Wys³any: Wto Cze 04, 2019 10:44 am OP Temat postu: |
|
|
Troch? niejasno si? sprecyzowa?em. Potrzebuj? drugim przyciskiem zako?czy? dzia?anie p?tli w zdarzeniu przycisku pierwszego. Nie wiem jak sprawdzi? czy zosta? klikni?ty drugi przycisk. Niestety standardowo nie mog? nic klikn?? dopóki jest wykonywana p?tla w przycisku 1. |
|
Powrót do góry |
|
 |
samolot
Do³±czy³: 26 Sty 2006 Posty: 8376 Sk±d: Toru?
|
Wys³any: Wto Cze 04, 2019 7:35 pm Temat postu: |
|
|
No wi?c proponuj? tak: zadeklaruj sobie na poziomie modu?u zmienn? typu Boolean, na przyk?ad o nazwie Przerwij i nadaj jej warto?? False. P?tla w zdarzeniu Click przycisku pierwszego niech si? wykonuje tak d?ugo, póki warto?? zmiennej Przerwij nie zmieni si? na True. Ty mo?esz klikni?ciem w drugi przycisk w ka?dej chwili zmieni? warto?? zmiennej Przerwij na True. Wówczas w p?tli w zdarzeniu przycisku pierwszego zostanie to wykryte i zostanie ona przerwana. _________________ Nie zadawaj bezcelowych pyta? / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie |
|
Powrót do góry |
|
 |
GregoryyyR
Do³±czy³: 03 Pa¼ 2012 Posty: 32
|
Wys³any: Wto Cze 04, 2019 9:10 pm OP Temat postu: |
|
|
Niestety ten sposób nie dzia?a poniewa? dopóki trwa zdarzenie przycisku odbierania danych to program nie reaguje, nie mog? wcisn?? innego przycisku. Mam jeszcze problem z zapisem do pliku gdy? dane w pliku nie pojawiaj? si? od razu a dopiero po jakim? czasie i nie wiem dlaczego. W pliku tekstowym tez pojawia?y si? po jakim? czasie ale pomog?o refresh. Poni?ej zamieszczam kod.
Kod: |   Private Sub btnCzytaj_Click(sender As Object, e As EventArgs) Handles btnCzytaj.Click
  
  
  Dim objStreamWriter As StreamWriter
  
  PRZERWIJ = False
  
  objStreamWriter = New StreamWriter("C:\Testfile.txt")
  
  While PRZERWIJ = False
  
  
  Dim incoming As String = SerialPort1.ReadChar
  
  Try
  
  SerialPort1.ReadTimeout = 15000
  Do
  
  If incoming Is Nothing Then
  Exit Do
  
  
  ElseIf incoming = Chr(13) Then
  
  incoming = Chr(incoming) & Chr(10)
  tbxDane.Text = tbxDane.Text & incoming
  objStreamWriter.Write(incoming & Chr(10))
  Refresh()
  
  Else
  
  incoming = Chr(incoming)
  tbxDane.Text = tbxDane.Text & incoming
  objStreamWriter.Write(incoming)
  Refresh()
  
  End If
  
  Loop
  Catch ex As TimeoutException
  incoming = "Error: Serial Port read timed out."
  Finally
  If SerialPort1 IsNot Nothing Then SerialPort1.Close()
  End Try
  
  End While
  
  objStreamWriter.Dispose()
  objStreamWriter.Close()
  
  End Sub
|
|
|
Powrót do góry |
|
 |
GregoryyyR
Do³±czy³: 03 Pa¼ 2012 Posty: 32
|
Wys³any: Czw Cze 06, 2019 2:43 pm OP Temat postu: |
|
|
Problem uda?o si? rozwi?za? poprzez wyodr?bnienie nas?uchiwania portu do osobnego w?tku
Kod: |   Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
  
  Dim incoming As String = SerialPort1.ReadChar
  
  If StatusPortu = True Then
  Try
  
  SerialPort1.ReadTimeout = 5000
  Me.Invoke(New UpdateFormTextDelegate(AddressOf UpdateFormText), incoming)
  
  Catch ex As Exception
  incoming = "Error: Serial Port read timed out."
  End Try
  
  End If
  
  End Sub
|
a otwarcie i zamkni?cie portu realizowane przez przyciski
Kod: |   Private Sub btnCzytaj_Click(sender As Object, e As EventArgs) Handles btnCzytaj.Click
  
  StatusPortu = True
  If SerialPort1.IsOpen = False Then
  SerialPort1.Open()
  End If
  
  End Sub
  
  Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
  
  StatusPortu = False
  SerialPort1.Dispose()
  SerialPort1.Close()
  
  End Sub
|
Oczywi?cie kod wymaga doprecyzowania, ale program si? nie zawiesza i w ka?dej chwili mo?na przerwa? i wznowi? odczyt z portu |
|
Powrót do góry |
|
 |
|