Go Down

Topic: arduino e visual studio (Read 1 time) previous topic - next topic

docdoc

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
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

torn24

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.

zoomx

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.
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
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.




docdoc

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ì... ;)
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Federico66

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 è configurabile e definisce il terminatore per la Serial.ReadLine.

Il suo valore predefinito è Environment.NewLine che è una costante e, per windows coincide con il vecchio vbCrLf (\r\n)

F
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

zoomx


Federico66

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
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

zoomx

docdoc,
la cosa sembra strana anche a me. Io infatti avevo suggerito di aggiungere un break e di controllare i valori.

Federico66


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
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

nid69ita

#39
May 03, 2019, 11:32 pm Last Edit: May 04, 2019, 07:16 pm by nid69ita
Grazie a @docdoc per la info e a @Federico per averlo provato
Buono a sapersi. Grazie della info.
my name is IGOR, not AIGOR

docdoc

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.. ;)
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

zoomx

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.


Federico66

A questo punto direi: di quale versione di Visual Studio stiamo parlando?
Io ho testato con Framework 4.5.


F
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

docdoc

#43
May 06, 2019, 01:41 pm Last Edit: May 06, 2019, 04:22 pm by docdoc
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? ;)
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Federico66

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

"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

Go Up