lesto:
no, ho win7 pre-SP1 originale e non c'è l'ombra di .net
In che senso? Mica lo vedi.. ad ogni modo se vuoi convincertene guarda cosa trovi nella cartella "C:\Windows\Microsoft.NET\Framework" ![]()
Ciao
lesto:
no, ho win7 pre-SP1 originale e non c'è l'ombra di .net
In che senso? Mica lo vedi.. ad ogni modo se vuoi convincertene guarda cosa trovi nella cartella "C:\Windows\Microsoft.NET\Framework" ![]()
Ciao
si vede tra i programmi installati :P, comunque so che non c'è perchè ho un gioco che richiede il .net versione 3.5 e me l'ha fatto installare.
Infatti dalla tabella di BrainBooster si evince che solo vista possiede .net fin dalla RTM (curioso che si sia "perso" nella RTM per win7)
Lo stesso gioco su wine + mono non funziona, con wine + .net funziona. (divagazione sul supporto per linux)
lesto:
si vede tra i programmi installati :P, comunque so che non c'è perchè ho un gioco che richiede il .net versione 3.5 e me l'ha fatto installare.
Infatti dalla tabella di BrainBooster si evince che solo vista possiede .net fin dalla RTM (curioso che si sia "perso" nella RTM per win7)Lo stesso gioco su wine + mono non funziona, con wine + .net funziona. (divagazione sul supporto per linux)
Ti ha fatto installare qualche aggiornamento veloce della 3.5 SP1 e basta, dalla tabella si vede benissimo che Win7 RTM ha .NET 3.5 col SP1.
Il supporto a Linux della comunità è spesso inutilizzabile in quanto incompleto e pieno di bug.
Ciao
ah ok, sp1 è riferito alla versione del .net, non del sistema operativo ![]()
dopo aver capito piuttosto bene coe funziona visual C# sto provando a comunicare con l'arduino, ho provato a seguire questa guida: http://www.instructables.com/id/Interfacing-your-arduino-with-a-C-program/?ALLSTEPS
per inviare messaggi dal computer all'arduino sembra funzionare bene, mentre nell'altro senso ho un po' di problemi, non mi da dei risultati sensati...
ho messo questo codice sull'arduino:
void setup()
{
Serial.begin(115200);
pinMode(13,OUTPUT);
}
void loop()
{
while(Serial.available()==0){}
char er=Serial.read();
if(er=='3')
digitalWrite(13,HIGH);
else
digitalWrite(13,LOW);
Serial.write(er);
Serial.write(10);
}
quindi io invio i dati dalla seriale e lui me li rimanda aggiungendo "\n" dopo ogni carattere...
sul visual c# ho messo questo:
private void button2_Click(object sender, EventArgs e)
{
if (!serialPort1.IsOpen)
{
try
{
serialPort1.Open();
}
catch
{
MessageBox.Show("error");
}
}
serialPort1.Write(textBox2.Text);
textBox2.Clear();
if (serialPort1.BytesToRead != 0)
{
if (!serialPort1.IsOpen)
{
try
{
serialPort1.Open();
}
catch
{
MessageBox.Show("error");
}
}
string read = serialPort1.ReadLine();
label3.Text = read;
}
else
{
label3.Text = "no message";
}
}
però nella label3 vedo sempre un punto di domanda per i primi 4 messaggi che mando poi inizia a mostrarmi i caratteri che avevo mandato prima, devo cambiare le dimensioni del buffer? o cosa ho sbalgiato?
dopo non ho capito un'altra cosa: devo aprire e chiudere ogni volta la porta o devo lasciarla sempre aperta?
grazie per questo ulteriore aiuto! ![]()
ciao,
mi spieghi questa riga? while(Serial.available()==0){}
che senso ha lasciar scriverla e non mettere niente dentro come si dovrebbe fare?
in realtò si scrive if(Serial.availale()>0){codice}
prova a usare questo sketch
void setup()
{
delay(2000); //mettilo sempre prima di ogni Serial.begin();
Serial.begin(115200);
pinMode(13,OUTPUT);
}
void loop()
{
if(Serial.available()>0){
char er=Serial.read();
if(er=='3')
digitalWrite(13,HIGH);
else
digitalWrite(13,LOW);
Serial.write(er); //sicuro che è write e non print/ln?
Serial.write(10);
}
}
significa che finchè la condizione è vera il micro resta bloccaro nel while, in pratica è un modo per aspettare che arrivino i dati su seriale. Bruttissimo appoccio, ma funzionale
lesto:
significa che finchè la condizione è vera il micro resta bloccaro nel while, in pratica è un modo per aspettare che arrivino i dati su seriale. Bruttissimo appoccio, ma funzionale
in effetti non ho mai visto scritto così.
ah il codice che ho riscritto funziona. alemno da serial monitor dell'ide va.
igor97:
ciao,
mi spieghi questa riga? while(Serial.available()==0){}
che senso ha lasciar scriverla e non mettere niente dentro come si dovrebbe fare?
in realtò si scrive if(Serial.availale()>0){codice}
il problema non è su arduino, quello va e l'ho provato col serial monitor....
poi fare:
void loop()
{
if(Serial.availale()>0){codice}
}
e fare:
void loop()
{
while(Serial.availale()==0){}
codice
}
secondo me il micro fa le stesse operazioni, l'ho scritto in fretta quel codice e non ho badato molto all' "estetica", ho modificato un codice che avevo già per fare presto e come è venuto è venuto ![]()
a me interessa capire come gestire la seriale dal visual C#...
?R:
igor97:
ciao,
mi spieghi questa riga? while(Serial.available()==0){}
che senso ha lasciar scriverla e non mettere niente dentro come si dovrebbe fare?
in realtò si scrive if(Serial.availale()>0){codice}il problema non è su arduino, quello va e l'ho provato col serial monitor....
poi fare:
void loop()
{
if(Serial.availale()>0){codice}
}
e fare:void loop()
{
while(Serial.availale()==0){}
codice
}secondo me il micro fa le stesse operazioni, l'ho scritto in fretta quel codice e non ho badato molto all' "estetica", ho modificato un codice che avevo già per fare presto e come è venuto è venuto :P a me interessa capire come gestire la seriale dal visual C#...
beh scrivere while seriale è disponebile o if seriale è ecc è la stessa cosa ![]()
per quanto riguarda il controllo dell seriale da c, io so che normalmente si indica la porta e poi la si apre.il collegamento non deve essere interrotto perchè è solo una perdita di tempo. purtroppo non uso c# ma basic per fare queste piccole app veloci.
devi vedere un po di documentazioen in rete ![]()
Igor
igor97:
per quanto riguarda il controllo dell seriale da c, io so che normalmente si indica la porta e poi la si apre.il collegamento non deve essere interrotto perchè è solo una perdita di tempo. purtroppo non uso c# ma basic per fare queste piccole app veloci.
devi vedere un po di documentazioen in rete
Igor
ok grazie per le info ![]()
purtroppo in internet non ho trovato molto che mi possa aiutare a capire il mio problema, i dati li ricevo ma non capisco cosa succede nel programma e come li interpreta il visual c#...
?R:
[...]
secondo me il micro fa le stesse operazioni, l'ho scritto in fretta quel codice e non ho badato molto all' "estetica", ho modificato un codice che avevo già per fare presto e come è venuto è venuto
a me interessa capire come gestire la seriale dal visual C#...
scritta coì hai ragione, ma se nel loop ci fosse altro (per esempio la lettura di un sensore), nel caso if la lettura avverrebbe velocissimamente, nel secondo caso invece ci sarebbe una lettura SOLO quando arriva almeno un carattere su seriale. Che se poi questo carattere non lo leggi rimane disponibile e torni all'esempio dell'if.
In oltre la combinazione if con dentro il while può essere molto comoda: mettiamo che decidi che le vuoi fare un comando così composoto:
1byte = lettera del comando
2byte = eventuale valore int (1 int = 2 byte) da impostare
come faresti?
fai un if (anzi uno switch) e dici:
se ho ricevuto un comando, e quel comando necessita di un valore, allora cicla la seriale finchè non leggo anche i due byte successivi.
Ora noterai che se per un errore di comunicazione i 2 byte non arrivano mai tutto il programma si blocca.
la soluzione sta nell'usare un buffer dei comandi nell'aggiungere un carattere di fine comando (lo '\n' che è il new-line, ovvero il carattere di a capo per i sistemi unix. per i windows sono 2 caratter '\r' + '\n' (il famoso vbCrLf per chi viene da visual basic et similia) e se non erroro nei mac è '\n' '\r'
a questo punto non usi un while, ma quando arriva un carattere via seriale lo metti nel buffer. quando leggi un \n allora controlli svuoti il buffer ed esegui il comando.
Noterai che in questo caso, anche in caso di errore di comunicazione (dal cavo attaccato male al fulmine a 100 metri) perderai il comando attuale ed eventualmente il successivo, ma il resto continuerà a funzionare egregiamente, specialemte se dai un avviso di errore in caso di comando non riconosciuto o di successo in caso di comando eseguito correttamete, in modo che anche l'altra parte sappia se il tutto è avvenuto correttamente oppure prenda la "decisione" pèiù saggia (potrebbe fregarsene dell'errore, oppure rifare la richiesta o chissà che altro)
come vedi potremmo andare avanti all'infinito, l'unico limite è la fantasia, e la soluzione migliore dipende da cosa vuoi fare. Per un piccolo esercizio il while va più che bene!
allora fai così:
crea una selectbox e cerca online il codice che elenca le seriali, quindi doppio click sul form in generale e metti li il codice in modo che aggiorni la seriale.
fatto questo affianco metti un pulsante "connetti" in tal modo quando lo clicchi apri la seriale selezionata dalla selectbox, sempre qui attivi un pulsante detto disconnetti e blocchi i pulsanti connetti e la selectbox.
ok quindi ora hai per aprire e chiudere la seriale (quindi evita altri check per favore)
ora fai così:
crea una funzione che deve fare quando riceve un dato da seriale e associala all'evento di ricezione così separiamo invio e ricezione (per fortuna).
fatto questo riprendi il tuo codice del solo invio e rimettilo dentro XD
avendo queste possibilità è inutile fasciarsi la testa con possibili timing errati, tanto vale mettere un hadler che gestisce la seriale in ascolto.
con visual basic è anche più facile ![]()
Vedo che hai scelto Windows Forms...hai impostato la velocità corretta nel controllo SerialPort?
I caratteri con punti interrogativi vuol dire che non sono lettere o caratteri sensati, dovresti capire che byte sono con dei breakpoint nel codice.
La seriale ti consiglio di lasciarla sempre aperta fintanto che comunichi con Arduino, puoi usare gli eventi del controllo SerialPort per semplificarti la vita
La prossima volta allega il progetto, ti aiuto meglio così
Ciao
superlol:
allora fai così:
crea una selectbox e cerca online il codice che elenca le seriali, quindi doppio click sul form in generale e metti li il codice in modo che aggiorni la seriale.
fatto questo affianco metti un pulsante "connetti" in tal modo quando lo clicchi apri la seriale selezionata dalla selectbox, sempre qui attivi un pulsante detto disconnetti e blocchi i pulsanti connetti e la selectbox.ok quindi ora hai per aprire e chiudere la seriale (quindi evita altri check per favore)
ora fai così:
crea una funzione che deve fare quando riceve un dato da seriale e associala all'evento di ricezione così separiamo invio e ricezione (per fortuna).fatto questo riprendi il tuo codice del solo invio e rimettilo dentro XD
avendo queste possibilità è inutile fasciarsi la testa con possibili timing errati, tanto vale mettere un hadler che gestisce la seriale in ascolto.
la prima parte ho provato a farla ma non ci sono riuscito
ho fatto solo un checkbox per aprire e chiudere ma la lista no... comunque ho provato ad associare la lettura all'evento della ricezione dei dati salla porta, questo è il codice:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string read = serialPort1.ReadExisting();
label3.Text = read;
}
però mi da errore e si blocca durante l'esecuzione, e non capisco cosa ci sia di sbagliato :~ allego il progetto su cui sto sperimentando visual C#...
grazie mille a tutti per l'aiuto ![]()
comunque qua mi sembra di andare OT, magari dopo guardo se posso chiedere sul forum di visual studio ![]()
superlol:
con visual basic è anche più facile
visual basic non mi piace perchè senza parentesi graffe faccio confusione ![]()
er.zip (3.34 MB)
cavolo ho installato visual vb, visual c++ ora mi scarico anche visual c# XD
comunque così a memoria c'era il sistema per ottenere l'array delle porte seriali e con un foreach le portavi come elementi della textbox, comunque fammi dare un'occhiata e ti riallego tutto ![]()
Visual Basic, C#.. alla fine è Windows Forms.. stessa minestra ![]()
Io avrei usato WPF per un'interfaccia più accattivante che non sembri un pizzoso gestionale!
string[] ports = System.IO.Ports.SerialPort.GetPortNames();
foreach(string port in ports) {
comboBox1.Items.Add(port);
}
questo è il codice da inserire al caricamento per elencare le porte nella combobox.
string read = serialPort1.ReadLine();
questo è per avere la lettura da seriale da mettere al posto di
string read = serialPort1.ReadExisting();
fammi sapere se va (ora però la seriale legge una riga, non di più)
Ho notato che quando scrivi col write non fai scaricare il buffer sulla porta
Per sicurezza aggiungi:
serialPort1.BaseStream.Flush();
Ad ogni modo oggi ho provato il tuo codice e il problema è un altro, diciamo non immediato per un beginner di C#.
Nell'evento serialPort1_DataReceived non puoi accedere al controllo label3 perché sei su un altro thread e quindi l'istruzione
label3.Text = read;
non viene eseguita. Ti consiglio di mettere SEMPRE la spunta su tutte le voci nella colonna Thrown del menù Debug/Exceptions per vedere in debug tutti gli errori.
la lettura avviene correttamente, il problema è li, nell'aggiornamento dell'interfaccia!
Come FIX veloce ti posso dire di sostituire con
BeginInvoke(new Action(() => {
label3.Text = read;
}));
ma leggi su internet qualcosa a proposito dei thread e dell'accesso ai controlli.
Altro consiglio, non rallentare il programma con progressbar o menate simili se non servono.. più è veloce meglio è! Andava di moda 20 anni fa la progress bar, ora meno c'è meglio è.
Ciao
flz47655:
Ho notato che quando scrivi col write non fai scaricare il buffer sulla porta
Per sicurezza aggiungi:serialPort1.BaseStream.Flush();Ad ogni modo oggi ho provato il tuo codice e il problema è un altro, diciamo non immediato per un beginner di C#.
Nell'evento serialPort1_DataReceived non puoi accedere al controllo label3 perché sei su un altro thread e quindi l'istruzione
label3.Text = read;non viene eseguita. Ti consiglio di mettere SEMPRE la spunta su tutte le voci nella colonna Thrown del menù Debug/Exceptions per vedere in debug tutti gli errori.
la lettura avviene correttamente, il problema è li, nell'aggiornamento dell'interfaccia!
Come FIX veloce ti posso dire di sostituire con
BeginInvoke(new Action(() => {
label3.Text = read;
}));
ma leggi su internet qualcosa a proposito dei thread e dell'accesso ai controlli. Altro consiglio, non rallentare il programma con progressbar o menate simili se non servono.. più è veloce meglio è! Andava di moda 20 anni fa la progress bar, ora meno c'è meglio è. Ciao
sul fatto della barra confermo è noiosa XD
piuttosto invece non mi pare sia un problema relativo ai thread in quanto il codice è sempre quello, non varia intendo non passi tra listati diversi (che allora si potrebbe dare errore) ma sullo stesso listato..
erro? ![]()
almeno io non ho mai avuto di questi problemi quando lavoravo con il serial receive su vb.net, forse è una cosa più da C# ![]()