Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - creare una bussola
Forum - C# / VB.NET - creare una bussola - Pagina 12

Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ] Precedente | Prossimo
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 14:46
Giovedì, 28/03/2024
Testo quotato

Postato originariamente da nightwolf:
mentre tornando a l vecchio codice ho provato ad abbassare l intervall di timer2 a 500 e 250, e niente, stesso errore. ho prvato anche a portare il delay di arduino che prima era a 300 di portarlo a 500 come timer2, ed è lo stesso errore.



Per non mescolare, con me eravamo al punto della listbox1 con i valori ricevuti con questo codice:
SOLUZIONE 2)
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
  2.           Dim str As String = RiceviDati()
  3.      
  4.            str = str.Replace(vbCrLf, "\n")
  5.            ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - str = " & str)
  6.            ListBox1.TopIndex = ListBox1.Items.Count - 1
  7.            ListBox1.HorizontalScrollbar = True
  8. End Sub



Regolando la temporizzazione non sei mai riuscito ad ottenere una lista di valori decenti?
Mi posti la foto con Timer2.Interval = 300?

SOLUZIONE 3)
Tutte le soluzioni proposte sicuramente possono essere ottimizzate e fatte funzionare... ma se si vuole instaurare una comunicazione sicura il Timer2 in VB va eliminato e bisogna attivare l'evento che si scatena quando la seriale riceve i dati, rendendo la comunicazione sincrona.

La prima cosa da fare è dichiarare la seriale con WithEvents:
Codice sorgente - presumibilmente VB.NET

  1. Dim serialport1 As New SerialPort ' vecchia dichiarazione da modificare
  2. Dim WithEvents serialport1 As New SerialPort ' modificata



a questo punto invece di Timer2 che va a leggere a caso:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub serialport_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles serialport1.DataReceived
  2.         Dim sp As SerialPort = DirectCast(sender, SerialPort)
  3.         Dim str As String = sp.ReadExisting() ' Legge tutti i dati presenti nel buffer di input
  4.         str = str.Replace(vbCrLf, "\n") ' se ci fossero degli accapo li rende visibili
  5.         ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - str = " & str) ' ora di ricezione
  6.         ListBox1.TopIndex = ListBox1.Items.Count - 1 ' rende visibile l'ultima riga
  7.         ListBox1.HorizontalScrollbar = True
  8. End Sub



In questo modo arduino ogni volta che invia dati sulla seriale, vengono letti in VB.
Modificando il delay su arduino VB resta sincronizzato.

Mi posti la foto della ListBox1 anche con questo codice?

Il codice è ancora solo per testare la comunicazione, solo dopo che nella ListBox1 riceverai i dati corretti aggiungeremo il codice VB per la bussola e il potenziometro con l'eliminazione dei dati non congrui.


Ultima modifica effettuata da Carlo il 28/03/2024 alle 15:20


in programmazione tutto è permesso
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2316
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 15:00
Giovedì, 28/03/2024
@carlo
Potrebbe essere un'idea quella di fare un override direttamente sulla comunicazione.

Ma ho teorizzato dopo che si, in alcuni casi, arduino possa inviare stringhe non sempre corrette.
Parliamo sempre di arduino un pò come un giocattolo e non preciso come un PLC.
basta veramente poco per mandarlo fuori fase.

La mia soluzione era basata sul controllo diretto della striga per verificare se esattamente esistono tutti i dati
alle loro rispettive posizioni, altrimenti ignora la chiamata attuale, andando alla successiva.

Ma nightwolf ha confuso completamente :rotfl:


@nightwolf

Hai usato

Codice sorgente - presumibilmente C# / VB.NET

  1. Shared esempio As String() = New String() {"-322.54;50-322.30", ";50-322.30;", "50-322.20;"}




E solo un esempio!!!


dovresti cambiare questa


Codice sorgente - presumibilmente C# / VB.NET

  1. Dim lettura As String = esempio(rn.[Next](0, esempio.Length))



la variabile lettura deve contenere ciò che legge dalla seriale.
Il resto lo fà la funzione.
La funzione controlla se la riga è strutturata in modo corretto con

-Bussola;Potenziometro.

Se rispecchia questa struttura, splitta i dati e ne controlla i valori.
Se anche uno di quei valore è errato, prosegue fin quando non trova una riga corretta
che contenga esattamente valori come esempio

-Bussola;Potenziometro
-350.22;50

tutto qua. deve funzionare per forza.

Questo link
https://dotnetfiddle.net/NCCtyX

Simula una lettura di arduino dando a caso appunto seguendo l'esempio, valori misti.
Errati e buoni.
Quando la funzione riceve la stringa strutturata correttamente, ne ricava i valori.
Altrimenti l'output è vuoto.
Prova premendo ripetutamente su esegui. e noterai che alcune volte funziona altre no.
Appunto perché scrive solo quando la stringa è ricevuta in modo corretto
o che contenga almeno in parte quello che serve per poterla leggere.

Conclusione

Codice sorgente - presumibilmente C# / VB.NET

  1. If val2(0).Length > 1 AndAlso val2(1).Length > 1 Then
  2.                 Integer.TryParse(val2(0).Split("."c)(0), bussola)
  3.                 Integer.TryParse(val2(1), potenziometro)
  4.                
  5.                  'Invece di usare Console.WriteLine, devi associare le variabili ai vari controlli
  6.                  'Variabile bussola per la bussola
  7.                  'Variabile potenziometro per il potenziometro fine
  8.  
  9.                 'Console.WriteLine("Bussola Vale: " & bussola)
  10.                 'Console.WriteLine("Potenziometro Vale:" & potenziometro)
  11.             End If



Ho scritto nei commenti cosa dovresti fare da li.
la variabile bussola contiene i gradi letti dalla stringa stessa cosa per la variabile potenziometro.
Devi semplicemente assegnare il valore delle variabili ai controlli fine.

Ultima modifica effettuata da Thejuster il 28/03/2024 alle 15:12


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 15:11
Giovedì, 28/03/2024
Testo quotato

Postato originariamente da Thejuster:
Ma ho teorizzato dopo che si, in alcuni casi, arduino possa inviare stringhe non sempre corrette.



Concordo, infatti la ListBox1 serve per vedere cosa si riceve e solo dopo aver valutato i possibili errori, intervenire con il codice.

La verifia se il dato è numerico e nel range previsto dovrebbe essere sufficiente.

@ nightwolf, vai a vedere la mia risposta:  delle 14:46 Giovedì, 28/03/2024

Ultima modifica effettuata da Carlo il 28/03/2024 alle 17:12


in programmazione tutto è permesso
PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 0:23
Venerdì, 29/03/2024
buonasera a tutti, allora, mettondo il timer2.interval=300 e scrivendo il questo codice
Codice sorgente - presumibilmente VB.NET

  1. Function RiceviDati() As String
  2.         Dim Ricevuti As String
  3.         Try
  4.             Ricevuti = SerialPort1.ReadExisting
  5.             If Ricevuti = Nothing Then
  6.                 Return "E;null" ' ritorna con la E
  7.             Else
  8.                 Return Ricevuti
  9.             End If
  10.         Catch ex As Exception
  11.             Return "E;" & ex.Message ' ritorna con la E
  12.         End Try
  13.     End Function


ho la prima foto


nightwolf ha allegato un file: errore.png (115745 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 0:25
Venerdì, 29/03/2024
sostituendo readExisting con serialport1.readline
ho invece la seconda foto


nightwolf ha allegato un file: errore1.png (115988 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 0:29
Venerdì, 29/03/2024
dopo un po, e svariati tentativi ho provato a scrivere questo
Codice sorgente - presumibilmente VB.NET

  1. Dim str As String = RiceviDati()
  2.  
  3.         str = str.Replace(vbCrLf, "\n")
  4.         ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - str = " & str)
  5.         ListBox1.TopIndex = ListBox1.Items.Count - 1
  6.         ListBox1.HorizontalScrollbar = True
  7.  
  8.         If str = "" Then Return
  9.         ' Tolgo l'eventuale "\r"
  10.         str = Replace(str, "\r", "")
  11.         ' Elaboro la stringa
  12.         Dim valoriDivisi() As String = str.Split(";")
  13.         If valoriDivisi(0) = "E" Then
  14.             lblgradi.Text = "errore"
  15.             ' in valoriDivisi(1) ' il tipo d'errore da mostrare dove vuoi
  16.         Else
  17.             ' Il primo dato è riferito ai gradi della bussola
  18.             valoriDivisi(0) = valoriDivisi(0).Replace(".", ",") ' se ci fosse il punto decimale viene sostituito con la virgola decimale
  19.             avanzamento = CInt(valoriDivisi(0))
  20.             lblgradi.Text = avanzamento.ToString("000°")
  21.             Pcboxbussola.Invalidate()
  22.  
  23.         End If



e la bussola ha iniziato a funzionare. adesso rimane soltante il volume, che se aggiungo la parte restante del codice mi da sempre l errore sulla stringa.

PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 0:37
Venerdì, 29/03/2024
contrordine ho aggiunto il resto del codice ma l errore che mi dava era su di una parte di codice non dichiarata, e più precisamente non riusciva a trovare
Codice sorgente - presumibilmente Plain Text

  1. video.Wmp1.settings.voume = video.Volume_control1.value


ma solamente perchè mancava la L in volume. ho aggiusto
Codice sorgente - presumibilmente Plain Text

  1. video.Wmp1.settings.volume = video.Volume_control1.value


adeso anche il volume ha iniziato a funzionare in parte, cioè si attiva la prima volta ma dopo smette di attivarsi. questo è il codice completo
Codice sorgente - presumibilmente VB.NET

  1. Imports System.IO.Ports
  2. Imports System.Drawing.Drawing2D
  3. Public Class principale
  4.     Dim bussola As Image = New Bitmap("bussola.png") ' bmp in ram dal file originale, deve esistere nella cartelle dell'eseguibile
  5.     Dim destinazione As Integer
  6.     Dim avanzamento As Integer
  7.     Dim direzione As Integer
  8.     Dim cX As Integer = bussola.Width \ 2
  9.     Dim cY As Integer = bussola.Height \ 2
  10.     Dim dX As Integer = bussola.Width
  11.     Dim dY As Integer = bussola.Height
  12.     Dim vel As Integer = 2 ' velocità, valori supportati 1, 2, 3, 5, 6, 9, 10 (divisibili per 90)
  13.  
  14.     Private Sub principale_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  15.         Me.CenterToParent()
  16.         btnconnetti.Enabled = False
  17.         btnChiudi.Enabled = False
  18.         cmbbaund.SelectedItem = "9600"
  19.  
  20.         media_pleyer.Timer5.Start()
  21.     End Sub
  22.  
  23.     Private Sub btnscanport_Click(sender As Object, e As EventArgs) Handles btnscanport.Click
  24.         cmbPorte.Items.Clear()
  25.         Dim myPort As Array
  26.         Dim i As Integer
  27.         myPort = IO.Ports.SerialPort.GetPortNames
  28.         cmbPorte.Items.AddRange(myPort)
  29.         i = cmbPorte.Items.Count
  30.         i = i - i
  31.         Try
  32.             cmbPorte.SelectedIndex = i
  33.  
  34.         Catch ex As Exception
  35.             Dim result As DialogResult
  36.             result = MessageBox.Show("com port non trovata", "Attenzione !!!", MessageBoxButtons.OK)
  37.             cmbPorte.Text = ""
  38.             cmbPorte.Items.Clear()
  39.             Call principale_Load(Me, e)
  40.         End Try
  41.         btnconnetti.Enabled = True
  42.         cmbPorte.DroppedDown = True
  43.     End Sub
  44.  
  45.     Private Sub btnconnetti_Click(sender As Object, e As EventArgs) Handles btnconnetti.Click
  46.         If cmbPorte.Text <> "" Then
  47.             Try
  48.                 btnconnetti.Enabled = False
  49.                 SerialPort1.BaudRate = cmbbaund.SelectedItem
  50.                 SerialPort1.PortName = cmbPorte.SelectedItem
  51.                 SerialPort1.Open()
  52.                 btnChiudi.Enabled = True
  53.                 Timer2.Start()
  54.                 lblConnessione.Text = "Connesso"
  55.                 lblConnessione.ForeColor = Color.Green
  56.                 Timerpanelincrease.Enabled = True
  57.             Catch ex As Exception
  58.                 MsgBox("errore:" & ex.Message, MsgBoxStyle.Critical)
  59.             End Try
  60.         End If
  61.  
  62.     End Sub
  63.  
  64.     Private Sub btnChiudi_Click(sender As Object, e As EventArgs) Handles btnChiudi.Click
  65.         btnChiudi.Enabled = False
  66.         SerialPort1.Close()
  67.         btnconnetti.Enabled = True
  68.         Timer1.Stop()
  69.         Timer2.Stop()
  70.         lblConnessione.Text = "Disconnesso"
  71.         lblConnessione.ForeColor = Color.Red
  72.         Timerpanelincrease.Enabled = True
  73.     End Sub
  74.  
  75.     Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
  76.         If SerialPort1.BytesToRead > 0 Then
  77.             Try
  78.                 Dim i As Single = SerialPort1.ReadExisting
  79.                 Console.WriteLine($"DATO: [{i}] ({i.ToString})")
  80.                 media_pleyer.lb_volume.Text = i.ToString + "%"
  81.                 media_pleyer.Volume_control1.value = i.ToString
  82.                 lb_volume.Text = i.ToString + "%"
  83.                 Volume_control1.value = i.ToString
  84.                 media_pleyer.Timer3.Start()
  85.                 media_pleyer.AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  86.                 AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  87.             Catch ex As Exception
  88.  
  89.             End Try
  90.         End If
  91.  
  92.     End Sub
  93.  
  94.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  95.         media_pleyer.Show()
  96.         Me.Hide()
  97.         lb_title.Text = ""
  98.         AxWindowsMediaPlayer1.Ctlcontrols.stop()
  99.         AxWindowsMediaPlayer1.URL = ""
  100.     End Sub
  101.  
  102.     Private Sub Timerpanelincrease_Tick(sender As Object, e As EventArgs) Handles Timerpanelincrease.Tick
  103.         If Panel3.Height > 0 Then
  104.             Panel3.Height -= 5
  105.         Else
  106.             Timerpanelincrease.Enabled = False
  107.         End If
  108.     End Sub
  109.  
  110.     Private Sub timerpanelreduce_Tick(sender As Object, e As EventArgs) Handles timerpanelreduce.Tick
  111.         If Panel3.Height < 80 Then
  112.             Panel3.Height += 5
  113.         Else
  114.             timerpanelreduce.Enabled = False
  115.         End If
  116.     End Sub
  117.  
  118.     Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  119.         If Panel3.Height > 0 Then
  120.             Timerpanelincrease.Enabled = True
  121.  
  122.         Else
  123.             timerpanelreduce.Enabled = True
  124.  
  125.         End If
  126.     End Sub
  127.  
  128.     Private Sub Btn_105_Click(sender As Object, e As EventArgs) Handles Btn_105.Click
  129.         AxWindowsMediaPlayer1.URL = "https://icy.unitedradio.it/Radio105.mp3"
  130.         lb_title.Text = "Radio 105"
  131.     End Sub
  132.  
  133.     Private Sub Btn_gamma_Click(sender As Object, e As EventArgs) Handles Btn_gamma.Click
  134.         AxWindowsMediaPlayer1.URL = "https://rn2.fluidstream.eu/gammaradio.aac"
  135.         lb_title.Text = "Gamma Radio"
  136.     End Sub
  137.  
  138.     Private Sub Btn_r101_Click(sender As Object, e As EventArgs) Handles Btn_r101.Click
  139.         AxWindowsMediaPlayer1.URL = "http://icecast.unitedradio.it/r101"
  140.         lb_title.Text = "R101"
  141.     End Sub
  142.  
  143.     Private Sub Btn_radioitalia_Click(sender As Object, e As EventArgs) Handles Btn_radioitalia.Click
  144.         AxWindowsMediaPlayer1.URL = "https://radioitaliasmi.akamaized.net/hls/live/2093120/RISMI/stream01/streamPlaylist.m3u8"
  145.         lb_title.Text = "Radio Italia Solo Musica Italiana"
  146.     End Sub
  147.  
  148.     Private Sub Btn_kisskiss_Click(sender As Object, e As EventArgs) Handles Btn_kisskiss.Click
  149.         AxWindowsMediaPlayer1.URL = "http://ice07.fluidstream.net:8080/KissKiss.mp3"
  150.         lb_title.Text = "Radio Kiss Kiss"
  151.     End Sub
  152.  
  153.     Private Sub Btn_Rds_Click(sender As Object, e As EventArgs) Handles Btn_Rds.Click
  154.         AxWindowsMediaPlayer1.URL = "http://stream1.rds.it:8000/rds64k"
  155.         lb_title.Text = "RDS"
  156.     End Sub
  157.     Dim x As Integer
  158.     Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
  159.  
  160.         If x = 0 Then
  161.             PictureBox1.BackgroundImage = My.Resources.power_off
  162.             SerialPort1.Write("A")
  163.             x = 1
  164.         Else
  165.             PictureBox1.BackgroundImage = My.Resources.power_on
  166.             SerialPort1.Write("O")
  167.             x = 0
  168.         End If
  169.     End Sub
  170.  
  171.     Private Sub Pcboxbussola_Paint(sender As Object, e As PaintEventArgs) Handles Pcboxbussola.Paint
  172.         e.Graphics.TranslateTransform(cX + Pcboxbussola.Width / 2 - cX, cY + Pcboxbussola.Height / 2 - cY) ' posizione centro
  173.         e.Graphics.RotateTransform(avanzamento) ' rotazione in gradi
  174.         e.Graphics.DrawImage(bussola, -cX, -cY, dX, dY) ' dimensione 100%
  175.     End Sub
  176.     Function RiceviDati() As String
  177.         Dim Ricevuti As String
  178.         Try
  179.             Ricevuti = SerialPort1.ReadLine
  180.             If Ricevuti = Nothing Then
  181.                 Return "E;null" ' ritorna con la E
  182.             Else
  183.                 Return Ricevuti
  184.             End If
  185.         Catch ex As Exception
  186.             Return "E;" & ex.Message ' ritorna con la E
  187.         End Try
  188.     End Function
  189.  
  190.     Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
  191.  
  192.  
  193.     End Sub
  194.  
  195.     Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
  196.         Dim str As String = RiceviDati()
  197.  
  198.         str = str.Replace(vbCrLf, "\n")
  199.         ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - str = " & str)
  200.         ListBox1.TopIndex = ListBox1.Items.Count - 1
  201.         ListBox1.HorizontalScrollbar = True
  202.  
  203.         If str = "" Then Return
  204.         ' Tolgo l'eventuale "\r"
  205.         str = Replace(str, "\r", "")
  206.         ' Elaboro la stringa
  207.         Dim valoriDivisi() As String = str.Split(";")
  208.         If valoriDivisi(0) = "E" Then
  209.             lblgradi.Text = "errore"
  210.             ' in valoriDivisi(1) ' il tipo d'errore da mostrare dove vuoi
  211.         Else
  212.             ' Il primo dato è riferito ai gradi della bussola
  213.             valoriDivisi(0) = valoriDivisi(0).Replace(".", ",") ' se ci fosse il punto decimale viene sostituito con la virgola decimale
  214.             avanzamento = CInt(valoriDivisi(0))
  215.             lblgradi.Text = avanzamento.ToString("000°")
  216.             Pcboxbussola.Invalidate()
  217.             ' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa
  218.  
  219.             media_pleyer.lb_volume.Text = valoriDivisi(1) + "%"
  220.             media_pleyer.Volume_control1.value = valoriDivisi(1)
  221.             lb_volume.Text = valoriDivisi(1) + "%"
  222.             Volume_control1.value = valoriDivisi(1)
  223.             media_pleyer.Timer3.Start()
  224.             media_pleyer.AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  225.             AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  226.             video.Wmp1.settings.volume = video.Volume_control1.value
  227.         End If
  228.     End Sub
  229.  
  230. End Class



PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 0:42
Venerdì, 29/03/2024
provando e riprovando ogni tanto mi da sempre errore sulla stringa

PM Quote
Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ] Precedente | Prossimo