|
|
|
|
Strumenti |
29-11-2017, 22:31 | #1 |
Junior Member
Iscritto dal: Nov 2017
Messaggi: 11
|
[VS 2013 C#] Problema con lettura stringa
Ciao Ragazzi!!
Mi ritrovo con un'altro problema nella lettura della stringa. Io al mio programma che mi legge i dati dal terminale collegato in RS232, vorrei aggiungere un label o un textbox indicando il valore "fisso" ricevuto. Dico fisso, perche dal terminale ricevo un flusso di dati continuo, e mi riempe il textbox o label di numeri. Qualcuno sa spiegarmi come si può fare?? Ringrazio anticipatamente |
30-11-2017, 07:42 | #2 |
Senior Member
Iscritto dal: Aug 2017
Messaggi: 469
|
Quale è il problema ?
Per scrivere in una textBox si usa la proprietà .Text, il problema al massimo è se vuoi concatenare questo flusso di valori. Ma puoi fare: Codice:
txtValore.Text += nuovoValore.toString(); |
30-11-2017, 15:28 | #3 |
Junior Member
Iscritto dal: Nov 2017
Messaggi: 11
|
Grazie per la risposta!
Il valore mi viene dato automaticamente dal terminale ed è varibile, non riesco a inserire un valore manualmente. Mi spiego meglio: ho un termostato che mi da la temperatura dentro a un recipiente, lui continua a buttarmi fuori un valore continuo...tipo all'inizio mi da 0, ma non me ne da uno solo, contina sempre a darmi 0 0 0 0 0 0 0 0 0 0 poi quando la temperatura aumenta e arriva tipo a 9 mi da 9 9 9 9 9 9 9 9. Io vorrei se fosse possibile che mi dia un valore solo visualizzato nel text o nel label. Grazie ancora! |
30-11-2017, 17:42 | #4 |
Senior Member
Iscritto dal: Aug 2017
Messaggi: 469
|
Ma allora non basta
Codice:
txtValore.Text = nuovoValore; Perdonami ma non conosco come hai implementato il codice e non mi è chiara la richiesta. |
30-11-2017, 18:43 | #5 |
Junior Member
Iscritto dal: Nov 2017
Messaggi: 11
|
Ho provato la soluzione che mi hai proposto ma non mi funziona o non riesco a capire dove mettere la correzione. In pratica il termostato continua ad aggiornare la stringa con la temperatura rilevata, a random, e mi visualizza una riga di zeri ( se la temperatura è a 0°) oppure 20° (se la temperatura è a 20°). Io volevo vedere uno solo 0° oppure un solo 20° o 50° a seconda della temperatura rilevata. Con VB6 ero riuscito a farlo ma non riesco a convertirlo in C#
Grazie comunque per l'interessamento |
01-12-2017, 08:38 | #6 | |
Senior Member
Iscritto dal: Aug 2017
Messaggi: 469
|
Quote:
0000000000000000000000 o 202020202020202020202020 ? Se sono tutti concatenati in effetti puoi comunque prendere solo gli ultimi due caratteri (https://msdn.microsoft.com/it-it/lib...v=vs.110).aspx) e convertirli in numero per avere una cifra sola in caso di 00 Questo però se la temperatura non arriva o supera i 100° Ultima modifica di Mursey : 01-12-2017 alle 08:52. |
|
01-12-2017, 08:54 | #7 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Quindi sei in una situazione di "polling" devi fare una sorta di piccolo driver semplificando al massimo hai una variabile intera statica "oldTemp" che setta a un valore impossibile tipo -1000000 e poi il tuo loop che legge dalla porta e fai (non far caso alla sintassi magari non è valido C#):
Codice:
private static oldTemp = -1000000; void ReadTemp() { while (true) { bool Temp = ReadMyTemp(); if (Temp == oldTemp) continue; oldTemp = Temp; WriteOnLabel(Temp); } }
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
01-12-2017, 08:58 | #8 |
Senior Member
Iscritto dal: Aug 2017
Messaggi: 469
|
Anche...
Magari rivediamo come mai tu hai una variabile che concatena i valori e ripensiamola... |
03-12-2017, 20:01 | #9 |
Junior Member
Iscritto dal: Nov 2017
Messaggi: 11
|
Ciao Ragazzi!!
Ho preso in mano il progetto solo ora. Ho provato le modifiche che mi avete suggerito ma non funzionano. Questo è il code con cui leggo il terminale. Forse sbaglio qualcosa?? Vi ringrazio!! Codice:
private void serialDataReceivedEventHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sData = sender as SerialPort; string recvData = sData.ReadLine(); recvData = recvData.Remove(15, 13); recvData = recvData.Replace("$", ""); serialData.Invoke((MethodInvoker)delegate { serialData.AppendText(recvData); }); } |
06-12-2017, 10:00 | #10 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Ma sei sicuro che mandi davvero una stringa compatibile con C#? Non è che invece lui manda solo dei byte "ascii"? Strano che a un certo punto incontri il fine linea tra l'altro...
Ha un manuale del programmatore di questo termostato? Avrà un qualche tipo di protocollo non posso crede che scrivere solo i numeri senza null'altro come potresti mai separali? 15014 è 15° - 01° - 4° o 150° - 14°?
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
06-12-2017, 16:33 | #11 |
Junior Member
Iscritto dal: Nov 2017
Messaggi: 11
|
Allora..mi sono spiegato male. Scusatemi. Provo a rispiegarmi. I dati che ricevo sono questi:
Codice:
$ 14 0 MJ 1000 Codice:
$ 14 0 MJ 1000 $ 14 0 MJ 1000 $ 14 0 MJ 1000 $ 14 0 MJ 1000 $ 14 0 MJ 1000 $ 14 0 MJ 1000 $ 14 0 MJ 1000 $ 14 0 MJ 1000 Codice:
14 14 14 14 18 19 20 A me interessava fare che nel textbox o label apparisse solo un valore e che sia quello aggiornato. Cioè il 14 che poi diventa 18 e poi 19 e poi 20 e via dicendo per tutti i gradi rilevati. Spero di avermi spiegato meglio. Grazie ancora per l' interessamento. |
06-12-2017, 18:25 | #12 |
Senior Member
Iscritto dal: Aug 2001
Messaggi: 9518
|
Come aggiorni i valori della textbox?
|
06-12-2017, 18:50 | #13 |
Junior Member
Iscritto dal: Nov 2017
Messaggi: 11
|
Ecco:
Codice:
private void serialDataReceivedEventHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sData = sender as SerialPort; string recvData = sData.ReadLine(); recvData = recvData.Remove(15, 13); recvData = recvData.Replace("$", ""); serialData.Invoke((MethodInvoker)delegate { serialData.AppendText(recvData); }); } Codice:
private void serialData_TextChanged(object sender, EventArgs e) { serialData.SelectionStart = serialData.Text.Length; serialData.ScrollToCaret(); } Grazie Ultima modifica di CayoPoro : 06-12-2017 alle 18:53. Motivo: Correzione |
06-12-2017, 21:21 | #14 |
Senior Member
Iscritto dal: Aug 2001
Messaggi: 9518
|
Non è che il problema è nell'uso del metodo .AppendText?
Hai provato a cambiare il contenuto usando direttamente .Text? Non conosco c# però dalla documentazione si fa così. Anche Mursey te l'aveva suggerito prima. Come avevi provato a modificare il codice? |
06-12-2017, 21:36 | #15 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Stai pollando in un loop stretto una porta seriale o non è settata in blocking mode e quindi è il kernel che ti rispara lo stesso valore o è il device che manda sempre lo stesso valore... la cosa più semplice se non vuoi che la textbox "flickery" è di salvarti il valore precedente in una variabile statica, verificare alla read successiva che non sia uguale (se è così fai return) altrimenti scrivi sulla GUI...
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
07-12-2017, 07:28 | #16 | ||
Junior Member
Iscritto dal: Nov 2017
Messaggi: 11
|
Quote:
Codice:
private void serialData_TextChanged(object sender, EventArgs e) { serialData.Text = recvData.toString(); } Quote:
Grazie ancora ragazzi per l'interessamento!! |
||
09-12-2017, 19:29 | #17 |
Senior Member
Iscritto dal: Aug 2017
Messaggi: 469
|
Al posto di
Codice:
serialData.Invoke((MethodInvoker)delegate { serialData.AppendText(recvData); }); Codice:
serialData.Invoke((MethodInvoker)delegate { serialData.Text = recvData; }); Codice:
serialData.Text = recvData; |
10-12-2017, 11:43 | #18 |
Junior Member
Iscritto dal: Nov 2017
Messaggi: 11
|
Grazie Mursey! Adesso funziona! Ci avevo già provato...ma probabilmenti commettevo degli errori da qualche parte e non mi andava. Ho riscritto tutto da capo e adesso con il tuo codice funziona! Grazie Mille!!
Grazie a tutti per l'interessamento!! |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:44.