Serial Port   otázka

VB.NET, Hardware, WinForms

Zdravím všetkých,

posielam data z eepromky cez atmegu16 do PC cez seriovu linku a chcem ich zapisať do Listboxu. Jedna sa o 8 bajtove bloky ktoré sú posielané zasebou. Problém mam v tom že do listboxu mi data zapiše sice spravne ale nie po 8 bajtov al ako sa mu chce pre priklad uvadzam vypis listboxu:

000000000000000011111111111111112222222222222222

33333333333333334444444444444444555555555555555566666666666666

66777777777777777788888888888888889999999999999999AAAAAAAAAA

AAAAAABBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCDDDDDDDDDDDDD

DDDEEEEEEEEEEEEEEEEFFFFFFFFFFFFFFFF0000000000

0000001111111111111111222222

222222222233333333333333334444444444444444555555555555

555566666666666666667777777777777777888888888888

88889999999999999999

AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCDDDDDDDDDDDDDD

DDEEEEEEEEEEEEEEEEFFFFFFFFFFFFFFFF...

a ja to chcem aby mi to v jednom riadku zobrazilo 8 bajtov čiže 16 znakov... Na nete som nasiel niečo take:

Dim WithEvents COMPort As New SerialPort
    Dim LookUpTable As String = "0123456789ABCDEF"
    Dim RXArray(128) As Char         ' Text buffer. Must be global to be accessible from more threads.
    Dim RXCnt As Integer

    Private Sub Receiver(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles COMPort.DataReceived
        Dim RXByte As Byte
        'Do
        RXCnt = 0
        Do
            RXByte = COMPort.ReadByte
            RXArray(RXCnt) = LookUpTable(RXByte >> 4)       ' Convert each byte to two hexadecimal characters
            RXCnt = RXCnt + 1
            RXArray(RXCnt) = LookUpTable(RXByte And 15)
            RXCnt = RXCnt + 1
        Loop Until (COMPort.BytesToRead = 0)
        Me.Invoke(New MethodInvoker(AddressOf Display))     ' Start "Display" on the UI thread
        'Loop Until (COMPort.BytesToRead = 0)               ' Don't return if more bytes have become available in the meantime
    End Sub

    Private Sub Display()
        ListBox1.Items.Add(New String(RXArray, 0, RXCnt))
    End Sub

vedel by mi s tým niekto pomôcť ?

Vďaka

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

Nevím, já jsem začátečník, ale nestačilo by za každý blok, který se zapisuje do toho listboxu, zařadit odřádkování Chr(13) & Chr(10)?

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

Nepomohlo to ale aj tak vďaka za tip

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

zkuste sem dát kód, kterým to načítáte vy, třeba něco najdeme...

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

veď tu vyššie som ho uviedol funkciou dislpay

 Private Sub Display()
        ListBox1.Items.Add(New String(RXArray, 0, RXCnt))
 End Sub

ešte ma napadlo či to nemože spôsobovať že od atmegy je to vysielane asynchronne... ale skúšal som to aj na nižšej aj vyššej baud rychlosti a to iste

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

Treba dať každý riadok zvlášť ako ďalší prvok do kolekcie ListBox.Items . Tak, ako to skúšal p. 78.99.207.186 .Nový riadok nepomôže, je to niečo celkom iné. Problém bude asi v rozdeľovaní na jednotlivé položky.

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

Skúste zbierať dvojčíslia do Stringu cez System.Text.StringBuilder, a v premennej počítať, koľko bajtov je v StringBuilderi. Povedzme, že na začiatku bude hodnota premennej 0. Až bude v premennej 7, je jasné, že v StringBuilderi je 8 dvojčíslí - potom pridáte do ListBox.Items StringBuilder.ToString(), StringBuilder vymažete (cez StringBuilder.Clear() )a celé odznovu.

Ak sa nejaké bajty zvýšia, môžete pridať do ListBox položku s menej bajtami.

Alebo uchovať zvyšok vo fronte alebo kolekcii(teraz si nie som istý, ktoré bude lepšie, asi fronta), a až budete mať zase 8 bajtov, začnete tým z kolekcie/fronty, a pokračujete tým, čo je nové. Výsledok by mal byť taký, že budete mať v ListBoxe vždy 8 bajtov, ale ak sa niečo zvýši, nebude to zobrazené. Vyberte si, čo bude pre Vás lepšie.

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

dal som to takto ale ale nefunguje mi to aj tak

Dim WithEvents COMPort As New SerialPort
    Dim LookUpTable As String = "0123456789ABCDEF"
    Dim RXArray(128) As Char         ' Text buffer. Must be global to be accessible from more threads.
    Dim RXCnt As Integer

    Private Sub Receiver(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles COMPort.DataReceived
        Dim RXByte As Byte
        'Do
        RXCnt = 0
        Do
            RXByte = COMPort.ReadByte
            RXArray(RXCnt) = LookUpTable(RXByte >> 4)       ' Convert each byte to two hexadecimal characters
            RXCnt = RXCnt + 1
            RXArray(RXCnt) = LookUpTable(RXByte And 15)
            RXCnt = RXCnt + 1
        Loop Until (COMPort.BytesToRead = 0)
        Me.Invoke(New MethodInvoker(AddressOf Display))     ' Start "Display" on the UI thread
        'Loop Until (COMPort.BytesToRead = 0)               ' Don't return if more bytes have become available in the meantime
    End Sub

a tu je ta funkcia display a tiež neviem či som to zapisal spravne

a vlastne potom ten riadok

Me.Invoke(New MethodInvoker(AddressOf Display))

tam ma byť či nie?

Private Sub Display()
        Dim sb As New StringBuilder(RXArray)

        For pocitaj = 0 To 7
            sb.Append(RXArray)
        Next

        ListBox1.Items.Add(sb.ToString())
        sb.Remove(0, sb.Length)
    End Sub

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

No, ani ja sám presne neviem, čo je na tom zle. Treba porozmýšľať. Možno dokonca aj skúsiť to celé odznovu. Ale neviem, či by nebolo lepšie udržiavať jednu inštanciu StringBuilder v premennej na úrovni triedy(Field), namiesto lokálnej premennej.

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

a ako to mam urobiť lebo veľmi sa v tom nevyznam

vďaka

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

Vyzera to dosť komplikovane no podarilo sa mi to s tymi vedomosťami čo mam nejak takto vyriešiť

 Dim TxBox As New TextBox   'zadeklaroval som docasny textbox

 Private Sub Display()
        TxBox.AppendText(New String(RXArray, 0, RXCnt))
 End Sub


 ' cez talcitko som vytvoril zoznam na listbox
 Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
        Dim pocet As Integer = 0
        'zistim dlzku celeho textoveho pola a podelim 8 bajtmi(16 znakov)
        For od = 1 To TxBox.TextLength / 16  
            ListBox1.Items.Add(TxBox.Text.Substring(pocet, 16)) ' a uz len zapisujem 8 bajtov do listboxu
            pocet += 16
        Next
        pocet = 0 ' vynulujem pre dalsie pouzitie
    End Sub

ešte ako by sa dalo to tlacitko vôbec nepoužiť ?

rozmýšľal som že cez timer ale funkcia dislay sa musi najpr dokončiť a tak môžem pokračovať tym listboxom...

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

Pane Bože, na takúto blbosť chcete použiť TextBox? Môžete to spraviť podobne, ale namiesto TextBoxu jednoznačne niečo iné, napríklad StringBuilder a obyčajný String.

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

Neviem ešte ako sa používa ten stringbuilder. Keby som to vedel tak sa tu nepytam či mi s tým vie niekto pomôcť veď sa to nedá všetko naštudovať a pochpiť hneď alebo na jednom príklade. Učím sa VB sam asi tak necelý polrok tak prosím majte strpenia.

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

Na začiatok súboru:

Imports System.Text

Inicializácia:

Dim sb As New StringBuilbder()

Pridať text:

sb.Append("Hello world!")

Alebo premennú typu String

Pridať Boolean alebo číslo inými verziami Append

viac: http://msdn.microsoft.com/en-us/library/...

Namiesto:

sb.Append(String.Format("{0}:{1}",0,1))

môžete napísať:

sb.AppendFormat("{0}:{1}",0,1)

Pridať String + koniec riadka:

sb.AppendLine("Za touto vetou následuje koniec riadka")

Vymazať celý StringBuilder:

sb.Clear()

Previesť na String:

Dim str As String = sb.ToString()

Toto sú základy použitia StringBuilderu, zvyšné členy zaisťujúce pokročilejšie úkony sú popísané: http://msdn.microsoft.com/en-us/library/...

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