Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Post - nino83

Pagine: [1] 2 3
1
Programmazione / Re:interpretazione stringa letta da seriale
« il: 25 Ottobre 2021, 09:36:41 »
Probabilmente quella sarebbe una soluzione al Replace.
Visto che ti sei appassionato  ;D vado oltre:
lo \r che arriva (ne leggo ben due, con quel codice) è dovuto quasi certamente ad una chiamata precedente (il primo) e alla stessa chiamata (il secondo \r), che altro non è che un carattere di conferma operazione, un OK, che l'arduino invia.  Dovrei pertanto prima leggere solo quel carattere (o il carattere alternativo, qualora ci sia un errore) e gestire la situazione.
Per adesso mi va anche bene così, poi vedrò.
Interessante l'idea del Seek (a quel punto devo però sempre sapere cosa leggerò, nel senso di quanti ne troverò, ecc).

In pratica la seriale non è come una variabile il cui valore viene sovrascritto ma, se non leggo (e svuoto), le informazioni si "accumulano" sempre di più.

2
Programmazione / Re:interpretazione stringa letta da seriale
« il: 22 Ottobre 2021, 17:50:44 »
Citazione
Cioè tu dici che è semplicemente e soltanto il debugger che ti fa vedere in console anche i due caratteri "\x", ma che in realtà il dispositivo esterno non ti invia.

penso che sia così... se uso "Len" per valutare la lunghezza di una stringa che, sul debugger, mi vien resa "\x05" ottendo 1, non 4!

Citazione
Ossia, tu dici che il dispositivo ti invia il valore (esadecimale) 05 proprio come valore numerico e non composto dai due caratteri dello zero e del cinque ?
Faccio un esempio:
se in console vedessi "\x05\x00", in realtà dalla porta è arrivato &05 &00, e NON:  &5C &78 &30 &35 &5C &78 &30 &30 ?

sì, esatto

3
Programmazione / Re:interpretazione stringa letta da seriale
« il: 22 Ottobre 2021, 17:32:14 »
Citazione
Scusami, ma io non ho capito perché hai accennato nei post precedenti alla presenza dell'istruzione "\x" seguita da due caratteri alfanumerici.  :rolleyes:
Puoi chiarire come è composto un singolo flusso di dati ricevuto attraverso la porta ?

Io solo adesso CREDO di aver capito che lo "\x" che leggevo nel debugger è una rappresentazione su schermo, leggibile, di un carattere non rappresentabile graficamente, visivamente.
Quindi "\x05" corrisponde al carattere il cui codice ASCII in esadecimale è "05".

Il flusso dei dati varia in base alla chiamata, per cui, in quel primo esempio, dopo aver letto, come stringa, dalla seriale, ottenevo "\x00\x05" che va invertito (sarebbe, in esadecimale, 0500, ovvero 1280).  In altre situazioni ho 4 "blocchetti" (caratteri) da leggere, sempre in ordine inverso (codifica little endian).

4
Programmazione / Re:interpretazione stringa letta da seriale
« il: 22 Ottobre 2021, 15:11:40 »
Alla fine, dopo tante testate al muro, una soluzione l'ho trovata:

Codice: [Seleziona]
      Dim valLettura As String = ""
      Try Read #SComm, valLettura, Lof(SComm)
      valLettura = Replace(valLettura, "\r", "")     
           
      Dim p1 As String = valLettura[1]
      Dim p2 As String = valLettura[0]
      Dim i1 As Integer = Asc(p1)
      Dim i2 As Integer = Asc(p2)
      Dim e1 As String = Hex$(i1, 2)
      Dim e2 As String = Hex$(i2, 2)
      Dim invertita As String = e1 & e2
      Dim out As Integer = Val("&H" & invertita)

Non so se ho fatto passaggi in più, ma funziona.

5
Programmazione / Re:interpretazione stringa letta da seriale
« il: 22 Ottobre 2021, 11:23:53 »
CVD....

lettura successiva e ciò che ottengo, depurando dagli "\r" che mi indica l'ok di invii precedenti, è  "\x00\x05" che, son quasi sicuro, deve essere letto al contrario, ovvero "0500" (questione di  "endian"... tutto sempre più complicato)... e ora boh?!?!

Vediamo se a suon di Mid$ e Asc riesco a far qualcosa....

 :hard:

grazie anche a te kicco

6
Programmazione / Re:interpretazione stringa letta da seriale
« il: 22 Ottobre 2021, 09:32:15 »
Niente da fare: ho provato quel codice ma non va... evidentemente le mie premesse erano errate.

Allo stato attuale avrei risolto così:

Codice: [Seleziona]
      Dim strDaInviare2 As String = "I2CR" & Chr(ModuloGenerale.settaggioCorrente.I2Cindirizzo) & Chr(1)
      SComm.Begin()
      Write #SComm, strDaInviare2
      SComm.Send() 
      Sleep intervSleep
           
      Dim valZoom As String = ""
      Try Read #SComm, valZoom, Lof(SComm)
      valZoom = Replace(valZoom, "\r", "")     
      Select Case valZoom
        Case "\x01"
          valZoom = "1"
        Case "\x02"
          valZoom = "2"
        Case "\x03"
          valZoom = "3"
      End Select

ma la cosa antipatica è che nemmeno a me è chiaro cosa faccia, nel senso che non so cosa ricevo.

Ammetto anche di aver faticato molto a leggere la tua spiegazione (a proposito, grazie!), ma per limite mio.  E probabilmente non sono riuscito a capirla fino in fondo.
Per adesso vado avanti così: a breve dovrò "tradurre" altre letture che venivano fatto in xojo sotto windows....vedremo cosa ne uscirà fuori...
Al limite gestisco caso per caso, senza avere una funzione di lettura "universale", che era quello che avrei voluto ottenere.

Ciao


7
Programmazione / Re:interpretazione stringa letta da seriale
« il: 21 Ottobre 2021, 15:50:39 »
vuott ma Asc() non prende una stringa? io cosa ho?  ???

cioè adesso mi va bene perchè 01 02 e 03 coincidono... ma se avessi "3D"?
farei convertire prima il 3 e poi la D per concatenarle?
penso sia sbagliato.  A quel punto ciò che dovrei leggere sarebbe altro...
e lo so, nessuno può darmi la risposta, perchè penso dipenda da come lavora l'arduino.... che cose intorcinate!

Trovo molto astruso ragionare sull'invio nella duplice veste stringa/valore_numerico... da mal di testa!

8
Programmazione / interpretazione stringa letta da seriale
« il: 21 Ottobre 2021, 14:53:29 »
Sarà banale, ma non riesco a capire cosa devo fare per "convertire" la stringa che ho e ottenere il dato che voglio.
Ho questo codice:

Codice: [Seleziona]
Dim strDaInviare2 As String = "I2CR" & Chr(30) & Chr(1)
SComm.Begin()
Write #SComm, strDaInviare2
SComm.Send() 
Sleep intervSleep
     
Dim valZoom As String = ""
Try Read #SComm, valZoom, Lof(SComm)
valZoom = Replace(valZoom, "\r", "")

a questo punto, in debug, leggo che "valZoom" contiene \x01 (oppure \x02 oppure \x03)

Qual è il modo corretto per leggere il valore?
Se ho ben capito, "\x" indica che le due successive cifre sono esadecimali (nello specifico, 01, 02 e 03 coincidono in entrambi i sistemi).
Come trasformarle? mi sta bene sia ottenere String che Integer...
lo so, sarà banalissimo, ma vorrei trovare il modo più corretto (e già ho dubbi su quanto ho scritto, tipo il "replace" utilizzato, reperito in rete).

Grazie




*********** EDIT ************
Per adesso avrei risolto così:

Codice: [Seleziona]
Dim valZoom As String = ""
      Try Read #SComm, valZoom, Lof(SComm)
      valZoom = Replace(valZoom, "\r", "")
      Select Case valZoom
        Case "\x01"
          valZoom = "1"
        Case "\x02"
          valZoom = "2"
        Case "\x03"
          valZoom = "3"
      End Select

9
Gianluigi, da lì posso modificare solo la data, ma non il suo formato

10
Salve,
esiste un modo per impostare il formato della data di sistema, come su windows?

esempio: la data breve la voglio in GG/MM/AAAA, con l'anno a 4 cifre....  20/05/2021 (E NON 20/5/21, ad esempio)

11
Programmazione / Re:Comunicare sulla seriale
« il: 18 Ottobre 2021, 14:57:49 »
Citazione
Se nella sub dei tasti metti sempre
SComm.Open()
SComm.Begin()
e relative chiusure alla fine devi attendere il tempo per inizializzare la seriale di conseguenza lo Slepp di attesa.
Se apri la seriale in form e la chiudi quando esci dal programma dovrebbe funzionare meglio.
Spero di non aver sbagliato qualcosa.

Sei stato chiaro ma, mi è sembrato di capire, che è buona norma APRIRE-LEGGERE/INVIARE-CHIUDERE contestualmente, e non lasciare seriale aperta per svariato tempo...

EDIT:
difatti ho verificato, mettendo solo l'Open all'apertura dell'app... funziona tutto, non va in reset... è proprio un comportamento diverso da quello che ottengo su windows utilizzando Xojo (linguaggio diverso, ma principio praticamente identico... lo stesso codice, su windows gira regolarmente... insomma all'open della seriale non viene resettato tutto.  Su linux invece è come se venisse inviato un reset).


12
Programmazione / Re:Comunicare sulla seriale
« il: 18 Ottobre 2021, 12:12:02 »
Usando esempi qua e la' ho rifatto tutto da zero (non mi sembra cambi molto, però sta funzionando):

Codice: [Seleziona]
Private intervSleep As Float = 0.5
Private SComm As SerialPort
Const None As Integer = 0
Private Rx As String

Public Sub Form_Open()
  SComm = New SerialPort As "SComm"
  SComm.PortName = "/dev/ttyACM0"
  SComm.Speed = "9600"
  SComm.Parity = 0
  SComm.DataBits = "8"
  SComm.StopBits = "1"
  SComm.FlowControl = 0
  Try
    SComm.Open()
    TextArea2.Text &= "seriale aperta..." & "\r\n"
    SComm.Close()
    TextArea2.Text &= "...e subito chiusa" & "\r\n"
   
  If Error
    Message("Problema nel test della seriale...")
    Quit
  End If

End 

Public Sub btnON_Click()
  SComm.Open()
  SComm.Begin()
  Sleep intervSleep
  Write #SComm, "HUB_ON"
  Sleep intervSleep
  SComm.Send()
  SComm.Close()
End

Public Sub btnOFF_Click()
  SComm.Open()
  SComm.Begin()
  Sleep intervSleep
  Write #SComm, "HUB_OFF"
  Sleep intervSleep
  SComm.Send()
  SComm.Close()
End

Se pongo intervSleep < 0.5 il comando non ha effetto (latenza di comunicazione, ok, anche se sembra un po' troppo).
E lo Sleep devo inserirlo ben 2 volte (il che non mi fa impazzire).
Intanto è un passo, ma ancora c'è tantissima strada da fare!

13
Avevo valutato la soluzione "timer", ma la ritenevo un po' uno sporco accrocchio.  Sapere che non son l'unico che pensa ste soluzioni mi rinfranca  ;D

Alla fine ho risolto "differendo" la funzione che può lanciare l'eccezione iniziale (che ha a che fare con inizializzazione di videocamere): non viene richiamata all'open, ma all'interno del tick del timer, ovviamente una sola volta.  Quantomeno la main form mi viene mostrata a tutto schermo e la finestra di errore, eventualmente, mi compare sopra di essa: essendo modale, cliccare sulla main form non ha effetti, così la finestra di errore non viene nascosta sotto altre finestre.

Grazie.

14
Programmazione / Re:Comunicare sulla seriale
« il: 18 Ottobre 2021, 09:24:53 »
Citazione
se fossi in te proverei a scrivere un piccolo programma di comunicazione


sì, ovviamente sto provando questo approccio: non sto lavorando direttamente sul mio programma reale, proprio per un discorso di semplicità.

Citazione
cortocircuitando il TX con RX per vedere se rileggi quello che scrivi sulla seriale.

 :-[  questo lo devo tradurre prima: non ho idea di cosa voglia dire

Citazione
Userei la gestione della porta direttamente dall'IDE di Gambas che trovo, per le prove molto comoda.

cioè "non via codice"? esiste qualche strumento integrato nell'IDE? cercherò a riguardo


Darò un'occhiata anche al progetto che, molto gentilmente, mi hai postato.
Grazie!

15
Salve, ho un'applicazione che lancia via shell una mia applicazione scritta in Gambas.  Vorrei che questa applicazione lanciata venisse mostrata costantemente in primo piano.

Di fatto mi accade che, a volte, per una possibile condizione di errore, venga mostrato un messaggio (Message.Warning) prima ancora della comparsa della finestra principale.  Se per sbaglio si clicca al di fuori della finestra di messaggio, questa va in secondo piano, non si vede più, e l'utente rimane sull'ultima schermata dell'applicazione chiamante. 

Come posso ovviare a questo?

------------------------------------------------------------------------------
EDIT: penso che l'unica soluzione sia quella di riuscire a far visualizzare subito la form principale a tutto schermo prima che venga mostrata la MessageBox.
------------------------------------------------------------------------------

Pagine: [1] 2 3