Arduino Forum

International => Italiano => Software => Topic started by: stefanotransam on Apr 27, 2019, 07:56 pm

Title: arduino e visual studio
Post by: stefanotransam on Apr 27, 2019, 07:56 pm
Un saluto a tutti ,mi chiamo Stefano e mi sono da poco iscritto a questo forum perché appassionato di elettronica.
Ho da poco iniziato con arduino e il relativo interfacciamento con visual studio per comandare varie apparecchiature.
Premetto che sono un neofita del settore , mi arrangio come posso,ho qualche esperienza di elettronica e di software  ma su quest' ultimo un po' meno.
Avrei un problemino da risolvere e chiedo a voi esperti se mi potete dare qualche dritta ?
In caso posso postare se qualcuno e' interessato ad aiutarmi le righe di codice.
 
Ho gia realizzato un software (per ora molto semplificato)  che tramite l'interfaccia grafica di visual studio e arduino comando dei rele' e ricevo i vari stati da essi, fin qui tutto ok.
Su visual studio accendo  il rele col pulsante (normale ,passo passo ,ecc) e ricevo il feedfack di ritorno e dentro una casella mi scrivo se il rele' e' acceso e spento (classico programmino che si trova anche su internet).
Il problema nasce nel rilevare questo stato di "acceso e spento" per comandare una casella  "picturebox"
per disegnare la lampadina accesa o viceversa.

Dentro una textbox scrivo "acceso" o "spento" proveniente da arduino sulla seriale ma la condizione
if valore="acceso" then  non viene rilevata come nelle istruzioni normali.
Devo fare in modo da rilevare (in visual studio) queste due condizioni per poter gestire le caselle "picturebox"

magari questo problema e' gia stato affrontato?

saluti

 
Title: Re: arduino e visual studio
Post by: gpb01 on Apr 27, 2019, 09:28 pm
Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (http://forum.arduino.cc/index.php?topic=113640.0) (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO (http://forum.arduino.cc/index.php?topic=149082.0) ... Grazie. :)

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)
Title: Re: arduino e visual studio
Post by: nid69ita on Apr 27, 2019, 11:09 pm
Dentro una textbox scrivo "acceso" o "spento" proveniente da arduino sulla seriale ma la condizione
if valore="acceso" then  non viene rilevata come nelle istruzioni normali.
Devo fare in modo da rilevare (in visual studio) queste due condizioni per poter gestire le caselle "picturebox"
Dopo la presentazione, spiega meglio questa parte. Mi pare hai problema in VS, ma a me non è chiaro che problema hai. Poi... visual studio dice poco. Programmi in VB o C# ?? 
Title: Re: arduino e visual studio
Post by: stefanotransam on Apr 28, 2019, 11:46 am
Ciao,ho effettuato la presentazione stamattina,spero di aver fatto tutto in modo corretto.
Innanzitutto grazie per l interessamento.
Ho scaricato visual studio 2018 e creato un form in vb con i relativi pulsanti (botton) per eccitare dei rele.
Ho anche creato una textbox dove viene rilevato per ogni rele lo stato (viene scritto nella textbox se il rele e' eccitato o no,in questo caso ho scritto acceso e spento)
Fin qui tutto ok funziona bene
Il tutto e' collegato ad arduino dove ho programmato i pin in entrata e uscita ,settato la porta,e aggiunto le relative istruzioni.
Il problema nasce che devo aggiungere l immagine di una lampadina ,accesa e spenta a secondo del rele eccitato e questa immagine e' contenuta in una istruzione picturebox .
La cosa piu semplice penso e' usare un istruzione "if" che rileva la scritta acceso e spento nella textbox ma viene ignorata.??
Title: Re: arduino e visual studio
Post by: nid69ita on Apr 28, 2019, 03:05 pm
Posta almeno il pezzo di codice che dici viene ignorata.
soprattutto dobbiamo capire la frase         
if valore="acceso" then  non viene rilevata
Title: Re: arduino e visual studio
Post by: stefanotransam on Apr 28, 2019, 03:50 pm
Code: [Select]
Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
      valore = SerialPort1.ReadLine
     

  End Sub


  Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
      TextBox1.Text = valore

      questo dalla parte di vb  mentre dalla parte di arduino :



val=digitalRead(8);

if (val==HIGH)
{
Serial.println("acceso");

}
else
{
Serial.println("spento");
}




  End Sub


Questa e' la parte di codice e funziona tutto.
il problema e' rilevare la scritta acceso o spento nella textbox di vb,
in condizioni "normali" uso un if ecc ecc ma leggendola nella text box non va ,per esempio:
io scriverei :  if valore ="acceso" then pictorebox.visible=true ma viene ignorata e non fa  nulla
??
Title: Re: arduino e visual studio
Post by: nid69ita on Apr 28, 2019, 03:54 pm
In primis:
In conformità al suddetto regolamento, punto 7, edita (in basso a destra del post, bottone More -> Modify) il tuo post e racchiudi il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie.
Infatti vedi che appare una faccina nel codice !!

valore è una variabile globale As String ?
Dici che hai provato con un if ... ma dove lo hai messo ? se non dai info ...
Comunque non capisco perchè la scrittura nel textbox lo fai in un timer.
Hai già l'evento sulla seriale quando ricevi dati. Fai tutto li.
Code: [Select]
Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
  valore = SerialPort1.ReadLine
  TextBox1.text = Valore
  if valore = "acceso" then
    picturebox1.visible=true
  else
    picturebox1.visible=false
  end if
  doevents
End Sub

Inoltre prova ad aggiungere un doevents (https://docs.microsoft.com/it-it/dotnet/api/system.windows.forms.application.doevents?view=netframework-4.8)
Title: Re: arduino e visual studio
Post by: stefanotransam on Apr 28, 2019, 05:03 pm
valore e' una variabile 'as string'
attribuisce a quello che legge sulla seriale il nome 'valore'
per il resto e' quello che ho fatto io ma la condizione if non la vede,e' come se non legge la parola 'acceso'

arduino rileva se lo stato logico del piedino di ingresso e' alto o basso ,lo salva nella variabile 'val' e lo scrive tramite il comando 'Serial.Println ("acceso") sul monitor seriale.
da parte di vb lo legge sulla serialport1.readline e me lo scrive nella textbox.
e qui funziona tutto,qualsiasi azionamento che faccio si eccita il rele e si porta a livello logico il piedino di arduino (5v o massa tramite un resistenza da 10k) per avere un riferimento veritiero.

in altre occasioni ho gia usato la condizione if /then ,ma in questo caso sembra non leggerla.

il timer continua a controllare lo stato della seriale,per ora i rele sono uno o due ma poi li moltiplico a 20,30 (arduino mega ecc,per ora uso arduino uno per gli esperimenti)

Le righe if then , non ci sono perché le ho cancellate vedendo che il programma non funzionava.
Title: Re: arduino e visual studio
Post by: torn24 on Apr 29, 2019, 06:59 am
Mi sorge un dubbio! Non so se sia il vero problema. che è molto comune inviando comandi sotto forma di stringa da seriale con arduino.
Nel tuo programma in VB, fai una readline, questo fa supporre che nella stringa inviata ci sia il terminatore di riga il newline.
Da ducumentazione non riesco a capire se serialport.readline TOGLIE O NO IL NEWLINE
Quando confronti la stringa ricevuta da arduino con la costante stringa nel programma, potrebbero risultare diverse perché in quella ricevuta da arduino è presente un carattere non visibile di newline, mentre nella costante non c'è.

Potrebbe essere che l'istruzione if faccia qualcosa del genere  IF "accendi\n"= "accendi" THEN.
Per cui risulta falsa.

Magari se controlli la lunghezza della stringa con apposita funzione, ti indicherà un carattere in più.

Come potresti risolvere?? Adesso conosco un po C# ma non Vb.net, quindi dovrai vedere come si fa in
vb.

1)Ricevo la stringa da seriale che contiene il newline
2)Prelevo una sottostringa da inizio stringa a posizione del newline
3)Adesso ho il comando senza newline e nell' IF dovrebbe fare il confronto in modo corretto.

Non conosco VB.net ma dovrebbe essere SIMILE a questo
Code: [Select]




valore=valore.Substring(0,valore.Length-1)

IF valore="accendi" THEN



Title: Re: arduino e visual studio
Post by: stefanotransam on Apr 29, 2019, 07:19 am
Se non sbaglio il comando .readline  dovrebbe gia togliere quel carattere in piu che si aggiunge alla stringa ma faro delle prove .
Title: Re: arduino e visual studio
Post by: torn24 on Apr 29, 2019, 07:37 am
In effetti ho letto che readline, dovrebbe togliere il newline.
Sta di fatto che è quasi certo, che se il confronto tra le due stringhe è falso vuol dire che le due stringhe non sono uguali  :smiley-confuse:
Title: Re: arduino e visual studio
Post by: zoomx on Apr 30, 2019, 04:20 pm
In effetti ho letto che readline, dovrebbe togliere il newline.
Sta di fatto che è quasi certo, che se il confronto tra le due stringhe è falso vuol dire che le due stringhe non sono uguali  :smiley-confuse:
Per cui basterebbe mettere un punto di interruzione in Visual Studio in quel punto e vedere i valori delle stringhe.
Title: Re: arduino e visual studio
Post by: docdoc on Apr 30, 2019, 05:08 pm
Questa e' la parte di codice e funziona tutto.
il problema e' rilevare la scritta acceso o spento nella textbox di vb,
in condizioni "normali" uso un if ecc ecc ma leggendola nella text box non va ,per esempio:
io scriverei :  if valore ="acceso" then pictorebox.visible=true ma viene ignorata e non fa  nulla
Allora, intanto per prima cosa modifica subito il tuo post per racchiudere nel tag "code" come ti è stato già chiesto.

Detto questo, tu fai:

Code: [Select]
Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        valore = SerialPort1.ReadLine

    End Sub


Ok, quindi nell'evento DataReceived registri nella variabile "valore" quello che leggi dalla seriale. Ma prima di tutto la variabile "valore" dove l'hai definita? E' globale, si? Diciamo di si.

Poi nell'evento (ossia se ci sono dati ricevuti nel buffer) tu fai ReadLine, ma non è così che si gestisce la cosa, mai usare ReadLine in eventi come DataReceived: la DataReceived ti informa che ci sono dei dati ricevuti dallo stream e messi nel buffer, mentre la ReadLine è sincrona ossia ferma il programma fino a che non riceve un vbLF (che non include nel valore di ritorno) dallo stesso stream!

O usi la ReadLine in una parte di codice che non sia questo (ad esempio in una while quando premi un pulsante, o in un timer, ma non in un evento seriale), oppure nella DataReceive leggi i caratteri ricevuti accumulandoli in una variabile dalla quale poi vai a cercare il vbLF estraendo tu i caratteri ricevuti fino a quel separatore.

In ogni caso tu poi con un timer metti nella textbox il valore:

Code: [Select]
   Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        TextBox1.Text = valore


e questo va anche bene, ma poi non hai mostrato il codice con i tuoi "If": se non funziona è perché le stringhe che confronti sono diverse, tu metti un breakpoint sulla "If" e vedi cosa contiene esattamente la variabile.

Per finire:
Code: [Select]

  Serial.println("acceso");


La Serial.println() aggiunge vbCRLF alla stringa, quindi la coppia CR e LF...

Title: Re: arduino e visual studio
Post by: Diego67 on May 02, 2019, 04:40 pm
Ipotizzando che "valore" sia una variabile globale di tipo "String" e che tutti i caratteri inviati da Arduino siano arrivati puoi verificare il contenuto di "valore" anche nel seguente modo:
Code: [Select]

If valore.Contains("Acceso") then
 .
 .
 . 
End If

Ti togli così il dubbio di cosa possa esserci al termine della stringa.
Title: Re: arduino e visual studio
Post by: stefanotransam on May 02, 2019, 09:23 pm
Ho messo il tag code (non so se ho fatto giusto) ,ho provato ad aggiungere l'struzione dettatami da (torn24) e funziona, ora riconosce la stringa acceso e spento memorizzata nella variabile (valore ),evidentemente come avete detto non erano uguali.

Non ho capito bene il discorso della readline nell'evento dataReceived che ferma il programma in attesa?
Dovrei usare la readline fuori dall'evento datareceived ? il programma praticamente e' sempre in attesa di un evento esterno per rilevare lo stato dei rele.

Title: Re: arduino e visual studio
Post by: nid69ita on May 03, 2019, 09:06 am
Non ho capito bene il discorso della readline nell'evento dataReceived che ferma il programma in attesa?
Dovrei usare la readline fuori dall'evento datareceived ? il programma praticamente e' sempre in attesa di un evento esterno per rilevare lo stato dei rele.
No, per me è okay. In evento datareceived ci sei quando ci sono dati, quindi readline legge e basta.
Io trovo invece inutile l'uso del timer.
Title: Re: arduino e visual studio
Post by: torn24 on May 03, 2019, 10:49 am
L'istruzione che ti ho postato, prende tutta la stringa ricevuta meno l'ultimo carattere.
Code: [Select]
valore=valore.Substring(0,valore.Length-1)

Il problema era che avevi un carattere in più, ma visto che la readline() toglie il newline, non era questo il carattere in più   :)
Title: Re: arduino e visual studio
Post by: docdoc on May 03, 2019, 11:08 am
No, per me è okay. In evento datareceived ci sei quando ci sono dati, quindi readline legge e basta.
Eh ma anche no. :) La gestione ad eventi deve essere ad eventi, non puoi avere un evento che al primo byte ricevuto attende in modo sincrono che finisca la linea. O gestisci in modo sincrono le cose o in modo asincrono.

La ReadLine() la usi fuori dagli eventi, se usi l'evento devi accumulare in un buffer i caratteri ricevuti e processare quelli non appena riceve il separatore (sempre nell'evento DataReceived, per cui anche il timer non serve più).

Title: Re: arduino e visual studio
Post by: nid69ita on May 03, 2019, 11:35 am
@docdoc   è un programmino in VB.  Hai un s.o. sotto il cofano. Secondo me non hai grossi problemi avendo su usb/seriale collegato l'Arduino. Ovviamente leggere 1 byte alla volta fino alla ricezione del cr/lf sarebbe meglio.
Title: Re: arduino e visual studio
Post by: docdoc on May 03, 2019, 01:11 pm
@docdoc   è un programmino in VB.  Hai un s.o. sotto il cofano. Secondo me non hai grossi problemi avendo su usb/seriale collegato l'Arduino.
Beh non parlavo di problemi, ma di logica di implementazione e di corretto uso della programmazione ad eventi: o sei procedurale o vai ad eventi, mischiare le due cose è sempre potenzialmente negativo o per il corretto funzionamento (se arresti l'esecuzione di un evento può dare problemi ad altre parti di codice) o quantomeno per il debugging.
Sai, con Arduino sono un hobbista, ma da decenni programmo in ambiente Windows, e se in azienda un programmatore mi facesse queste cose lo avrei cazziato allo stesso modo. ;)

Quote
Ovviamente leggere 1 byte alla volta fino alla ricezione del cr/lf sarebbe meglio.
Si, ovviamente. Ma dipende da cosa fa (deve fare) il programma oltre ad attendere il CRLF... ;) Se è sequenziale ossia procedurale, si usa ReadLine nella procedura e niente eventi DataReceived, se non lo è e si usano gli eventi allora vanno usati come Bill comanda :D
Title: Re: arduino e visual studio
Post by: docdoc on May 03, 2019, 01:22 pm
Il problema era che avevi un carattere in più, ma visto che la readline() toglie il newline, non era questo il carattere in più :)
E' perché in realtà la println() aggiunge DUE caratteri, CR e LF (o vbCr e vbLf, oppure char(13)+chr(10)) e se il LF viene tolto dalla ReadLine resta il CR...

Io risolverei genericamente con un semplice Replace, per sicurezza:

Code: [Select]
valore=valore.Replace(chr(13), "")

In ogni caso per me continua a non avere senso implementare dei protocolli (che servono a due programmi per dialogare) usando caratteri e stringhe "umane". Basta anche mandare "0" per "spento" e "1" per "acceso" ed evitare i separatori, quindi basta leggere UN byte senza tanti problemi:

Code: [Select]
Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
  valore = SerialPort1.ReadChar
  If valore = "1" Then
    TextBox1.text = "acceso"
  Else
    TextBox1.text = "spento"
  End If
  picturebox1.visible = (valore = "1")
  doevents
End Sub
Title: Re: arduino e visual studio
Post by: Federico66 on May 03, 2019, 01:26 pm
Scusate se mi intrometto :-)

Eh ma anche no. :) La gestione ad eventi deve essere ad eventi, non puoi avere un evento che al primo byte ricevuto attende in modo sincrono che finisca la linea. O gestisci in modo sincrono le cose o in modo asincrono.
La ReadLine() la usi fuori dagli eventi, se usi l'evento devi accumulare in un buffer i caratteri ricevuti e processare quelli non appena riceve il separatore (sempre nell'evento DataReceived, per cui anche il timer non serve più).
Mi trovi perfettamente d'accordo, inoltre, nello caso specifico (poca esperienza), opterei per gestire il tutto con un Timer che legge il contenuto della seriale tramite ReadExisting e sulla base di quello trova agisce di conseguenza.

Premesso che da Arduino venga inviato:
Code: [Select]

  Serial.println("acceso");


allora in VB potrebbe essere qualcosa del genere, se le immagini sono su file:
Code: [Select]

  Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim Incoming As String = SerialPort1.ReadExisting()
    If Not String.IsNullOrEmpty(Incoming) Then
      If Incoming.StartsWith("acceso") Then
        TextBox1.text = "acceso"
        pictureBox1.Image = New Bitmap("acceso.png")
      Else
        TextBox1.text = "spento"
        pictureBox1.Image = New Bitmap("spento.png")
      End If
    End If
  End Sub

E' molto elementare, ma così evita gli eventuali cr lf (non ricordo se ReadExisting li elimina :) )
Naturalmente andrebbe gestito almeno l'eventuale timeout/scollegamento della seriale

F.

Title: Re: arduino e visual studio
Post by: nid69ita on May 03, 2019, 01:26 pm
In ogni caso per me continua a non avere senso implementare dei protocolli (che servono a due programmi per dialogare) usando caratteri e stringhe "umane". Basta anche mandare "0" per "spento" e "1" per "acceso" ed evitare i separatori, quindi basta leggere UN byte senza tanti problemi:
Quoto in toto.
Title: Re: arduino e visual studio
Post by: Federico66 on May 03, 2019, 01:31 pm
In ogni caso per me continua a non avere senso implementare dei protocolli (che servono a due programmi per dialogare) usando caratteri e stringhe "umane". Basta anche mandare "0" per "spento" e "1" per "acceso" ed evitare i separatori, quindi basta leggere UN byte senza tanti problemi:
Daccordissimo :-)
Title: Re: arduino e visual studio
Post by: docdoc on May 03, 2019, 01:37 pm
E' molto elementare, ma così evita gli eventuali cr lf (non ricordo se ReadExisting li elimina :) )
Non credo. ReadLine si, ma ReadExisting legge tutti i caratteri presenti nel buffer, inclusi CR e LF.
In ogni caso per me l'OP (visto anche che non mi sembra abbia molta esperienza) fa prima a mandare "0" o "1" e basta, niente println() ma solo print() di un singolo carattere, quindi eviti anche .StartsWith()...

Quote
Naturalmente andrebbe gestito almeno l'eventuale timeout/scollegamento della seriale
Eh, certo, qui però entriamo in questioni più complesse visto anche che non hai Hardware Handshake con Arduino, quindi bisognerebbe implementare handshake o qualche heartbeat, cose che per ora risparmierei all'OP... ;)
Title: Re: arduino e visual studio
Post by: Federico66 on May 03, 2019, 02:09 pm
Eh, certo, qui però entriamo in questioni più complesse visto anche che non hai Hardware Handshake con Arduino, quindi bisognerebbe implementare handshake o qualche heartbeat, cose che per ora risparmierei all'OP... ;)
Non sapevo, ho poca esperienza con Arduino, buono a sapersi.
Grazie
Title: Re: arduino e visual studio
Post by: zoomx on May 03, 2019, 03:53 pm
E' perché in realtà la println() aggiunge DUE caratteri, CR e LF (o vbCr e vbLf, oppure char(13)+chr(10)) e se il LF viene tolto dalla ReadLine resta il CR...
Stiamo parlando di VB e Windows, se la readline toglie i caratteri in più alla fine credo proprio che li tolga entrambi. Ma devo controllare.
Title: Re: arduino e visual studio
Post by: docdoc on May 03, 2019, 04:15 pm
Stiamo parlando di VB e Windows, se la readline toglie i caratteri in più alla fine credo proprio che li tolga entrambi. Ma devo controllare.
Ecco, si, controlla (https://docs.microsoft.com/it-it/dotnet/api/system.io.ports.serialport.readline?view=netframework-4.8)... ;)

Quote
SerialPort.ReadLine Method
Spazio dei nomi:
System.IO.Ports
Assemblies:
System.dll, System.IO.Ports.dll
Legge fino al valore di NewLine nel buffer di input.

public string ReadLine ();
Restituisce
String
Contenuto del buffer di input fino alla prima occorrenza di un valore di NewLine.
Ed il NewLine:

Quote
Valore della proprietà
Valore che rappresenta la fine di una riga. Il valore predefinito è un avanzamento riga, NewLine.

Questa proprietà determina quale valore (byte) definisce la fine di una riga per il ReadLine e WriteLine metodi. Per impostazione predefinita è il valore end-of-line NewLine.
Title: Re: arduino e visual studio
Post by: zoomx on May 03, 2019, 04:27 pm
Ho controllato
https://docs.microsoft.com/it-it/dotnet/api/system.environment.newline?view=netframework-4.8 (https://docs.microsoft.com/it-it/dotnet/api/system.environment.newline?view=netframework-4.8)
Quote
NewLine può essere usato in combinazione con il supporto di nuova riga specifiche del linguaggio, ad esempio i caratteri di escape '\r' e '\n' in Microsoft c# e C/C++, o vbCrLf in Microsoft Visual Basic.
In altre parole in VB il NewLine è la combinazione di CR+LF ma, credo, solo sotto Windows perché, appunto, fa riferimento ad Environment.Newline, mentre sotto Linux/Unix (con Mono o altri compilatori) dovrebbe essere il solo LF ma anche qui dovrei controllare.


Era così anche nel Visual Basic che precedeva il NET solo che li era sempre la combinazione dei 2 caratteri e non dipendeva dall'ambiente.

Title: Re: arduino e visual studio
Post by: Federico66 on May 03, 2019, 04:32 pm
In altre parole in VB il NewLine è la combinazione di CR+LF ma, credo, solo sotto Windows perché, appunto, fa riferimento ad Environment.Newline, mentre sotto Linux/Unix (con Mono o altri compilatori) dovrebbe essere il solo LF ma anche qui dovrei controllare.
Da quello che leggo, in realtà è configurabile, quindi puoi decidere cosa considerare NewLine nella trasmissione seriale.

UPDATE
Cioè per assurdo puoi fare una cosa del genere:
Code: [Select]

'Da Arduino
'Serial.print("ciaoPIPPO");

'Da Net
SerialPort1.NewLine = "PIPPO"
SerialPort1.ReadLine() '-> Ritorna Ciao


Interessante :-)

F
Title: Re: arduino e visual studio
Post by: docdoc on May 03, 2019, 04:39 pm
Corretto, anche io programmavo nel "vecchio" VB dove c'erano le costanti (che hanno mantenuto) vbCR e vbLF ed anche vbCRLF...

Ma quello che hai linkato non è il reference della NewLine della Serial ma di System, e che indica, appunto, il valore predefinito per gli ambienti Unix e Windows.

Quello della Serial è SerialPort.NewLine, che è definito come l'ho riportato, ed il cui valore è, da definizione, il "valore (byte) che definisce la fine di una riga". "Il" valore, è singolare, è byte, quindi uno.. :)
Se poi uno cambia anche il SerialPort.NewLine per definire vbCRLF, (non so se si possa fare, ma va bene) ok, ma parliamo di due "NewLine" diversi.

Comunque sia, non è quello il modo di gestire quello che voleva l'OP, per cui... :D
Title: Re: arduino e visual studio
Post by: torn24 on May 03, 2019, 04:45 pm
Be un carattere veniva aggiunto alla stringa mandata su seriale da arduino "la prova è che togliendo l'ultimo carattere il confronto tra stringhe risulta vero", i caratteri che possono logicamente venire aggiunti secondo me sono proprio quelli indicati da docdoc, altri caratteri non avrebbero nessuno scopo o senso.
Title: Re: arduino e visual studio
Post by: zoomx on May 03, 2019, 04:50 pm
NewLine è solo quello (la proprietà è in sola lettura),  è però configurabile il carattere o i caratteri da considerarsi come terminatore, anche questo fin dal Visual Basic 3.0 e forse anche da VBdos maaaa...... dovrei controllare.


Nella stessa pagina è confermato che

Quote
Stringa che contiene "\r\n" per le piattaforme non Unix o "\n" per le piattaforme Unix.
Non so che succede sotto MAC. Originariamente era il solo CR ma adesso che usa un kernel similUnix avrà cambiato?

@docdoc
guarda che ci sono arrivato proprio dalla pagina che hai linkato tu, proprio per controllare.
Contenuto del buffer di input fino alla prima occorrenza di un valore di NewLine. (http://Contenuto del buffer di input fino alla prima occorrenza di un valore di NewLine.)
Clicchi nel link corrispondente a NewLine e vai qui
https://docs.microsoft.com/it-it/dotnet/api/system.io.ports.serialport.newline?view=netframework-4.8#System_IO_Ports_SerialPort_NewLine (https://docs.microsoft.com/it-it/dotnet/api/system.io.ports.serialport.newline?view=netframework-4.8#System_IO_Ports_SerialPort_NewLine)
Quote
Valore che rappresenta la fine di una riga. Il valore predefinito è un avanzamento riga, NewLine.
Anche qui NewLine è un link che porta alla pagina che ho linkato io dove c'è scritto quanto riportato sopra.

In effetti la documentazione parla di un solo byte ma il valore NewLine sotto Windows è formato dai due caratteri.



Title: Re: arduino e visual studio
Post by: docdoc on May 03, 2019, 05:03 pm
Ok, la cosa è diventata accademica, ed in fondo non particolarmente importante, comunque sia la SerialPort.NewLine è:

public string NewLine { get; set; }

invece la Environment.NewLine:

public static string NewLine { get; }

Ora quindi la questione è solamente: ma la SerialPort.NewLine quale valore predefinito assume?

Se è il byte NewLine ('\n') allora dato che è definita anche con set; è modificabile e si può impostare leggendo il valore di ambiente Environment.NewLine che dovrebbe contenere i 2 byte "\r\n". In tal caso però ci si chiede quindi perché nella descrizione parlino di "(byte)", forse un refuso visto anche che il valore come si vede è una "string"...

Se invece la SerialPort.NewLine riporta correttamente il valore della Environment.NewLine allora non si spiega perché quando ha rimosso l'ultimo carattere dalla stringa ha funzionato (e comunque la definizione "(byte)" non è corretta neanche in questo caso e fuorviante).

Per questo penso che la risposta sia la prima (SerialPort.NewLine contiene solo '\n') e che se si volesse modificare il comportamento della ReadLine() per eliminare anche '\r' bisognerebbe fare qualcosa del tipo:

mySerial.NewLine = Environment.NewLine

Ma diciamo che non mi va di caricare tutto Visual Studio per provare, per cui buona così... ;)
Title: Re: arduino e visual studio
Post by: Federico66 on May 03, 2019, 05:04 pm
NewLine è solo quello (la proprietà è in sola lettura),  è però configurabile il carattere o i caratteri da considerarsi come terminatore, anche questo fin dal Visual Basic 3.0 e forse anche da VBdos maaaa...... dovrei controllare.
Stiamo parlando di due cose diverse:
Serial.NewLine (https://docs.microsoft.com/it-it/dotnet/api/system.io.ports.serialport.newline?view=netframework-4.8) è configurabile e definisce il terminatore per la Serial.ReadLine.

Il suo valore predefinito è Environment.NewLine (https://docs.microsoft.com/it-it/dotnet/api/system.environment.newline?view=netframework-4.8#System_Environment_NewLine) che è una costante e, per windows coincide con il vecchio vbCrLf (\r\n)

F
Title: Re: arduino e visual studio
Post by: zoomx on May 03, 2019, 05:05 pm
Hai ragione!
Title: Re: arduino e visual studio
Post by: Federico66 on May 03, 2019, 05:11 pm
Ora quindi la questione è solamente: ma la SerialPort.NewLine quale valore predefinito assume?
Dalla documentazione:
"Il valore predefinito è un avanzamento riga, Environment.NewLine", quindi in windows "\r\l"!
quindi a me pare strano che abbia funzionato eliminando solo un carattere!!

Qui non ho Arduino, ma essendo curioso, stasera provo :-)

F
Title: Re: arduino e visual studio
Post by: zoomx on May 03, 2019, 05:31 pm
docdoc,
la cosa sembra strana anche a me. Io infatti avevo suggerito di aggiungere un break e di controllare i valori.
Title: Re: arduino e visual studio
Post by: Federico66 on May 03, 2019, 11:25 pm

Ho fatto dei test e al contrario di quello che dice la documentazione, di default SerialPort.NewLine vale chr(10), quindi la ReadLine la elimina, ma lascia effettivamente un chr(13).

Ho provato a settare SerialPort.NewLine uguale a Environment.NewLine, in questo caso la ReadLine elimina chr(13)+chr(10), quindi ritorna correttamente la stringa.

F
Title: Re: arduino e visual studio
Post by: nid69ita on May 03, 2019, 11:32 pm
Grazie a @docdoc per la info e a @Federico per averlo provato
Buono a sapersi. Grazie della info.
Title: Re: arduino e visual studio
Post by: docdoc on May 04, 2019, 07:15 pm
Ho fatto dei test e al contrario di quello che dice la documentazione, di default SerialPort.NewLine vale chr(10), quindi la ReadLine la elimina, ma lascia effettivamente un chr(13).
Ho provato a settare SerialPort.NewLine uguale a Environment.NewLine, in questo caso la ReadLine elimina chr(13)+chr(10), quindi ritorna correttamente la stringa.
Grazie!
Che è esattamente quello che dicevo io.. ;)
Title: Re: arduino e visual studio
Post by: zoomx on May 05, 2019, 08:47 pm
A questo punto direi: di quale versione di Visual Studio stiamo parlando?
Poi faccio qualche test anche io perché mi pare di averlo usato e non avere incontrato quel problema. E' vero che spesso cercho la presenza di una stringa invece di confrontare, in questo caso cercherei ON e OFF.

Title: Re: arduino e visual studio
Post by: Federico66 on May 06, 2019, 11:16 am
A questo punto direi: di quale versione di Visual Studio stiamo parlando?
Io ho testato con Framework 4.5.


F
Title: Re: arduino e visual studio
Post by: docdoc on May 06, 2019, 01:41 pm
A questo punto direi: di quale versione di Visual Studio stiamo parlando?
Beh più che la versione di Visual Studio direi la versione di Framework... ;)
Comunque sia, non è influente, la SerialPort.NewLine() esiste dal Framework 3.0, e la Environment.NewLine() dalla 1.0.

Quote
E' vero che spesso cercho la presenza di una stringa invece di confrontare, in questo caso cercherei ON e OFF.
Si, ma io continuo a suggerire di smetterla di usare stringhe e di usare un semplice carattere/byte a 0 o 1. Perché complicarsi la vita? ;)
Title: Re: arduino e visual studio
Post by: Federico66 on May 06, 2019, 02:31 pm
Comunque sia, non è influente, la SerialPort.NewLine() esiste dal Framework 3.0, e la Environment.NewLine() dalla 1.0
In ogni caso, visto che esiste, andrebbe sempre valorizzato a quello che serve, a prescindere dal suo valore di default


Si, ma io continuo a suggerire di smetterla di usare stringhe e di usare un semplice carattere/byte a 0 o 1. Perché complicarsi la vita? ;)
Beh, ma a volte può essere utile, ad esempio il valore rilevato da un sensore, lo stato di n lampadine, o semplicemente un msg di errore :-)

F

Title: Re: arduino e visual studio
Post by: zoomx on May 06, 2019, 02:36 pm
Confermato!
Con Arduino mando 10 caratteri + CR e LF
In VB ne ricevo 11 e l'ultimo è proprio il CR.
Il programma in VB si limita ad aprire la porta e a settare i parametri baud e 8N1 senza cambiare altro. L'Handshake è già su none.
Framework 4.7.1

docdoc,
avevi ragione tu!!!!

Curiosamente non ho trovato nessuna issue né post nè altro a riguardo.
Title: Re: arduino e visual studio
Post by: docdoc on May 06, 2019, 04:28 pm
In ogni caso, visto che esiste, andrebbe sempre valorizzato a quello che serve, a prescindere dal suo valore di default
Si, credo che basti mettere all'inizio del proprio codice, dopo aver creato una variabile di classe SerialPort una cosa del tipo:

Code: [Select]
mySerial.NewLine = Environment.NewLine;
Così si evita qualsiasi problema.

Ma non mi è mai capitato perché io sono fissato, per me i protocolli di comunicazione tra programmi vanno progettati "per le macchine" non "per gli umani"... ;)

Confermato! docdoc, avevi ragione tu!!!!
Grazie! ;)  :D
Title: Re: arduino e visual studio
Post by: zoomx on May 06, 2019, 04:50 pm
Ho aperto un issue sulla documentazione qui
https://github.com/dotnet/dotnet-api-docs.it-it/issues/2 (https://github.com/dotnet/dotnet-api-docs.it-it/issues/2)
ci sono arrivato proprio dalla pagina della documentazione.
Ma vedo che in totale ci sono solo 2 issue, il mio e un altro che è stato chiuso. Vedremo come finisce.

L'ho aperta in inglese ma vedo che avrei potuta aprirla anche in italiano. Ma il problema riguarda tutte le lingue.

Sui protocolli. Dipende. Nel mio caso uso roba leggibile perché ho aggiunto la possibilità di interagire da parte di umani tramite un terminale, un po' come i comandi AT per modem e ESP8266.
Ma quando l'interazione umana è esclusa allora vado di singoli caratteri o direttamente valori binari.
Title: Re: arduino e visual studio
Post by: docdoc on May 06, 2019, 05:03 pm
Sui protocolli. Dipende. Nel mio caso uso roba leggibile perché ho aggiunto la possibilità di interagire da parte di umani tramite un terminale, un po' come i comandi AT per modem e ESP8266.
Si ti capisco, ovviamente non conosco il contesto delle tua implementazioni quindi può darsi. Ma anche se fosse, basta usare caratteri "leggibili", nell'esempio dell'OP se mando "0" invece di "spento\r\n" e "1" invece di "acceso\r\n" è sufficientemente comprensibile anche da un umano credo... ;)

Poi ci sono anche altri casi in cui questa cosa si può fare (per dire, negli anni '90 realizzai un antispam che divenne anche abbastanza famoso, Spam Terminator, nel quale implementai un server SMTP ed un client POP3, protocolli che dialogano comunque con linee di testo, quindi "da umano") ma dipende dallo scopo del progetto e soprattutto dall'abilità del progettista e del programmatore. Se uno non ha mai avuto a che fare con protocolli e per di più ha scarsa pratica con il linguaggio e l'ambiente, direi che meglio mandare "0" o "1" senza auto-complicarsi la vita.. ;)

Title: Re: arduino e visual studio
Post by: zoomx on May 07, 2019, 09:28 am
Risposta immediata!
Quote
You are correct, @zoomx (https://github.com/zoomx), that the value of the NewLine property is "\n" or vbLF. We'll update the documentation accordingly; see #2413 (https://github.com/dotnet/dotnet-api-docs/pull/2413).
La documentazione verrà corretta.Non so quale documentazione in quanto c'è anche questo
Quote
Hi team,
I'm moving this here since the user is reporting an error in the original documentation
best
cioè qui

https://github.com/dotnet/dotnet-api-docs/issues/2412 (https://github.com/dotnet/dotnet-api-docs/issues/2412)
dove le issue sono nettamente più numerose.

Edit:
Ora ho capito. Il link che avevo seguito partiva dalla documentazione in italiano (nonostante avessi attivato l'interruttore per averla in inglese) e poi la issue è stata spostata in quella inglese.
Title: Re: arduino e visual studio
Post by: Federico66 on May 07, 2019, 12:27 pm
beh, è quasi da ridere :),
seguo un forum su Arduino e C, e becchiamo un bug nella documentazione del Framework Net  ::)  ::)
Title: Re: arduino e visual studio
Post by: zoomx on May 07, 2019, 12:54 pm
Ho il sospetto che questo bug fosse presente da almeno un decennio, forse di più.
Sul repo GitHub della versione inglese ci sono centinaia di issue aperte (o aperti?).