VB 2010 - RS232   otázka

VB.NET, Hardware

Ahojte, robím si aplikáciu pre komunikáciu PC s Atmelom. Odošlem na ser. port Enter a Atmel mi pošle nejaké dáta, čísla. Keď použijem Hyperterminál, tak prijmem čísla pekne za radom pod seba, ale keď požijem aplikáciu VB 20120, tak každý druhý riadok je prázdny. Príklad kódu som našiel na internete. Nie som moc znalý, tak sa trápim. Tu sú obrázky ako to vyzerá:

https://skydrive.live.com/redir?resid=F72A8322F9F8E747!225&authkey=!ALJhMhX2HpPeNUI

https://skydrive.live.com/redir?resid=F72A8322F9F8E747!226&authkey=!AN2f0ni_pJTliDI

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        For Me.i = 0 To 255
            rx(i) = 0
        Next

        receive_data = SerialPort1.BytesToRead
        If receive_data = 0 Then Exit Sub
        If receive_data > 256 Then
            receive_data = 256
        End If
        For Me.j = 1 To receive_data
            rx(input) = SerialPort1.ReadByte
            RichTextBox1.Text = RichTextBox1.Text & Chr(rx(input))
            input = input + 1
            Label2.Text = RichTextBox1.Lines.Length
        Next
        Label2.Text = RichTextBox1.Lines(0)
        Label3.Text = RichTextBox1.Lines(16)
        input = 0
        Timer1.Enabled = False

        For Me.i = 0 To 255
            rx(i) = 0
        Next
        Timer1.Interval = 500
        Timer1.Enabled = True

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

Proč je to na časovač a ne na událost SerialPort.DataReceived?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

No skúšal som to dať aj tam, ale hádže to nejakú chybu.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

hádže to nejakú chybu.

Bez komentáře...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Už som to spravil a chybu už nezobrazuje, ale príjem tých čísel je úplne rovnaký.

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

Tak už prijímam čísla pekne za sebou. Musel som upraviť program v Atmega. Teraz mám ďalší problém. Atmega pošle na koniec súčet všetkých čísel. Chcel by som, aby aj v programe sa spravil súčet prijatých čísel a porovnal. Chcel som spočítať hodnoty v poly rx ale nejako sa mi nedarí.

Imports System
Imports System.ComponentModel
Imports System.Threading
Imports System.IO.Ports

Public Class Form1
    Dim WithEvents com1 As New IO.Ports.SerialPort
    Dim port_name As String()
    Dim RS232_sum As Char

    Dim rx(512) As String

    Dim i As Integer
    Dim j As Integer
    Dim receive_data As Byte

    Dim input As String
    Dim temporary As Byte = 1




    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ComboBox1.Sorted = True
        port_name = IO.Ports.SerialPort.GetPortNames()
        For Each comp1 In port_name
            ComboBox1.Items.Add(comp1)
        Next
        ComboBox1.SelectedIndex = 0
        Odpojit.Enabled = False


        System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False

    End Sub

   


    




    Private Sub Pripojit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pripojit.Click
        Timer1.Enabled = True
        Timer1.Interval = 600
        SerialPort1.PortName = ComboBox1.SelectedItem
        If SerialPort1.IsOpen = False Then
            SerialPort1.Open()
        End If
        Me.SerialPort1.DiscardOutBuffer()           'clear output buffer
        Me.SerialPort1.DiscardInBuffer()            'clear input buffer
        Me.SerialPort1.RtsEnable = True
        Me.SerialPort1.DtrEnable = True
        Odpojit.Enabled = True
        Pripojit.Enabled = False


        input = 1
        Me.SerialPort1.Write(Chr(13))
      





    End Sub


    Private Sub Odpojit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Odpojit.Click
        Timer1.Stop()
        Me.SerialPort1.Close()
        Odpojit.Enabled = False
        Pripojit.Enabled = True
        RichTextBox1.Clear()
    End Sub


    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived



        

        receive_data = SerialPort1.BytesToRead
       
        rx(input) = SerialPort1.ReadExisting

       
        RichTextBox1.Text = RichTextBox1.Text & rx(input)
        input = input + 1
        
        Label2.Text = RichTextBox1.Lines.Length
       

       
    End Sub
End Class

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

Tenhle kód je dost děsivej :)

nicméně pokud potřebujete sečíst pole nějakých hodnot, je několik možností.

rx(512) as string by bylo lepší rovnou definovat pro typ čísel jaký v něm ukládáte (int, double, single, byte ....)

Při vkládání do pole používat:

rx(input) = convert.to????(SerialPort1.ReadExisting)

nebo nějakou sofistikovanější konverzi (např: TryParse)

Nicméně s přetypováním na Int32

1) pomocí cyklu

Dim sum As Integer
For i = 0 To rx.Length - 1
    sum += Convert.ToInt32(rx(i))
Next

2) pomocí dotazu

Dim sum as integer = rx.ToList().Sum(Function(c) Convert.ToInt32(c))

výraz:

If SerialPort1.IsOpen = False Then
'se nepoužívá, místo toho
If Not SerialPort1.IsOpen Then

máte tam spoustu nepoužitých deklarací:

com1, RS232_sum, i, j, temporary, timer1

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

viem. Kód vypadá strašne. Toto je môj len druhý program na ktorom pracujem. Každopádne sa mi to aj s Vašou pomocou podarilo vyriešiť. Super. Ďakujem

nahlásit spamnahlásit spam 1 / 1 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