Opět RS 232   zodpovězená otázka

VB.NET, Hardware

Zdravím, nerad otravuji se stále stejnou věcí, ale nedaří se mi zachytit událost na seriovém portu. Teplotní čidlo zapojené na RS232 přijme dotaz a odpoví, to si přečtu příkazem readExistig, ale událost, že na port přišla data se nevyvolá. Neví někdo co stím? Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý večer,

zkuste poslat zdrojový kód. To co říkáte je divné a možná máte někde syntaktickou chybu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zasílám ten code. Čidlo pošle teplotu když je DTR aktivní.uálost ale naneskočí.

Public Class Form1
    Dim com1 As New IO.Ports.SerialPort
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If com1.IsOpen = False Then
            com1.Open()
        End If
        com1.DtrEnable = True
        com1.RtsEnable = True
    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        Label1.Text = " zachycena událost"
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If com1.IsOpen = False Then
            com1.Open()
        End If
        Label2.Text = com1.ReadExisting
    End Sub
End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud chcete chytat události, nadeklarujte objekt komunikace s Comm portem s klíčovým slovem WithEvents:

Dim WithEvents com1 As New IO.Ports.SerialPort

Zbytek kódu je velmi slušně a správně napsaný.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky, událost zachycena ale místo zobrazení... label2.text = com1.readxisting... dostanu chybovou hlášku - "Cross-thread operation not valid: Control 'Label2' accessed from a thread other than the thread it was created on". A nedaří se mi chybu odstranit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je tím, že událost se zavolá v jiném vlákně než běží formulář. Proto musíte kód zavolat přes delegáta. Zkuste to takhle. Ale psal jsem to z hlavy, tak tam snad není chyba:

Public Class Form1
    Dim WithEvents com1 As New IO.Ports.SerialPort
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If com1.IsOpen = False Then
            com1.Open()
        End If
        com1.DtrEnable = True
        com1.RtsEnable = True
    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        If Me.InvokeRequired() Then
            Dim dr As New DataRecievedDelegate(AddressOf DataRecieved)
            Me.Invoke(dr, e)
        Else
            DataRecieved(e)
        End If
    End Sub

    Delegate Sub DataRecievedDelegate(ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
    Sub DataRecieved(ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
        Label1.Text = " zachycena událost"
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If com1.IsOpen = False Then
            com1.Open()
        End If
        Label2.Text = com1.ReadExisting
    End Sub
End Class
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky, s delegátem to funguje. Jen jsem místo "SerialPort1_DataReceived" použil "Com1_DataReceived"

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je jen úprava jmen. Na funkčnosti to nic nemění.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

jestli můžu navázat na tohle téma - mám problém s tím, že chci mít nadefinovanou komunikaci po RS232 jako samostatnou třídu. Tedy mít hlavní formulář a v něm akorát nadefinovanou RS232:

Public Class Form1
Public RS232 As New portRS232

Private Sub Poslat()
RS232.SendData(...)
End Sub

Private Sub Chyba(ByVal code As Byte)
lblErr.text = "Je to rozbity - kod chyby: " & code
End Sub

End Class

...a pak třídu s RS232:

Class portRS232
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
If Me.InvokeRequired() Then
 Dim dr As New DataRecievedDelegate(AddressOf Chyba)
 Me.Invoke(dr, e)
Else
 DataRecieved(e)
End If
End Sub

Delegate Sub DataRecievedDelegate(ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)

End Class

A nemůžu přijít na to, jak se z té třídy portRS232 dostanu na tu proceduru Chyba ve Form1, a už vůbec ne na to, jak jí při příjmu dat předat nějakej kód.

(Nechci předávat kód systémové chyby, ale zpracovat nějak přijatá data a jen pokud budou vyhodnocena data jako špatná, vygenerovat nějaký kód a ten předat do hlavního vlákna Form1.)

(Do příkladu nahoře jsem nevypisoval kód, který se stará o odesílání, protože ten funguje bez problémů.)

Doufám, že jsem se vyjádřil nějak pochopitelně - dyštak to upřesnim.

Díky,

Lukas

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback