Fine della ricezioni dati

giovedì 13 marzo 2008 - 15.26

Spartacus Profilo | Newbie

Ciao a tutti e grazie in anticipo per l'aiuto.
vengo al sodo, da un mio programma scritto in c# con vs 2005 .net framework versione 2.0 devo verificare quando un vecchio strumento ha terminato di inviarmi i dati, da manuale dello strumento non ho visto che mandi un teminatore di stringa. Purtroppo c'è anche da dire che le stringhe sono insiemi di dati memorizzati in maniera arbitraria dall'utente e quindi non posso nemmeno verificare la quantità di byte letti prima di chiudere. La terminazione della comunicazione con la seriale mi deve generare un evento diverso dal timeout e dalla chiusura forzata della comunicazione stessa.
Ringrazio in anticipo chiunque voglia tentare di darmi una mano o spunti per nuove idee

Cristian

Anonimo Profilo | Senior Member

Ahi Ahi Ahi...
Dunque, non mi viene in mente nulla che non sia il timeout (impostare un timer).
Se non c'è modi di sapere che lunghezza ha la stringa devi perforza usare simili trucchetti!

Magari l'apparecchio codifica i dati in modo che i primi bytes rappresentano la lunghezza della stringa?

ad esempio

00010000 1011000101010010
======= ==============
lunghezza dati
dati
che
seguono

Potrebbe essere? se l'apparecchio non fa cose del genere ho paura che non puoi inventarti altro...

Quello che frega è che i dati sono arbitrari, altrimenti...

Fammi sapere.

Spartacus Profilo | Newbie

praticamente lo strumento in questione è uno strumento che misura diverse grandezze per la certificazione a norma europea degli impianti elettrici. Essendo di progetto molto vecchio manda una stringa per ogni misura memorizzata dall'utente

esempio:

misura 1 Rs = 500mΩ

peccato che io non posso sapere a priori se l'utente ha memorizzato 1 misura, nessuna misura o 100 mila misure.

Praticamente quello strumento potrebbe essere anche direttamente collegato a una stampante rs-232 per farti capire in breve qual'è la struttura dei dati che lui invia. Per di + vista questa ulteriore funzione di stampa devo anche attendere che sia l'utente dallo strumento a conciare a inviare i dati, quindi questo mi frega da subito con il timer.

Ciao e grazie per l'aiuto

Cristian

Anonimo Profilo | Senior Member

>praticamente lo strumento in questione è uno strumento che misura
>diverse grandezze per la certificazione a norma europea degli
>impianti elettrici. Essendo di progetto molto vecchio manda una
>stringa per ogni misura memorizzata dall'utente
>
>esempio:
>
>misura 1 Rs = 500mΩ
>
>peccato che io non posso sapere a priori se l'utente ha memorizzato
>1 misura, nessuna misura o 100 mila misure.
>
>Praticamente quello strumento potrebbe essere anche direttamente
>collegato a una stampante rs-232 per farti capire in breve qual'è
>la struttura dei dati che lui invia. Per di + vista questa ulteriore
>funzione di stampa devo anche attendere che sia l'utente dallo
>strumento a conciare a inviare i dati, quindi questo mi frega
>da subito con il timer.

Ho capito, effettivamente non è semplice in quanto è tutto molto ehm... "aleatorio", non c'è niente di sicuro...
Se riesci posta per favore un esempio di output del sistema che vediamo come possiamo cavarcela anche perchè mi sembra strano che non abbiano codificato un qualche segnale di fine output perchè se espone un interfaccia seriale era stato pensato per essere collegato ad un computer o perlomeno ad una stampante, no? Magari c'era un programmino che girava sotto DOS che controllava lo strumento, almeno credo...

Più di così... non so che dirti. Anche perchè se fosse un solo output te ne freghi e apetti il timeout ma su più output ad intervalli arbitrari non so...

>
>Ciao e grazie per l'aiuto
>

Quale aiuto ? Per ora l'unica cosa che sono riuscito a dirti e "non so" !

>Cristian

Fammi sapere dai.

Spartacus Profilo | Newbie

Anche se per il momento mi hai detto solo non so almeno ci stai provando e anche in tempi rapidissimi quindi solo per questo ti meriti un grosso grazie.

Questo che ti posto di seguito è un esempio di uscita che mi da lo strumento. in questo caso sono state memorizzate 2 misure con tutti i relativi parametri.

 ASITA
* REALIMP *


RECALL TEST 1

Ul TEST 237 V
Zs 0.584 Ω
Rs 0.583 Ω
Xs 0.039 Ω
Isc 406 A
Uc 2 V


RECALL TEST 2

Ul TEST 235 V
Zs 0.590 Ω
Rs 0.586 Ω
Xs 0.068 Ω
Isc 399 A
Uc 2 V




Ovviamente quante misure memorizzare dipende dal cliente che usa lo strumento

Anonimo Profilo | Senior Member

Ciao e scusa il ritardo oggi ho avuto da fare...

Come dicevo quello che frega è che non c'è neanche un messaggio tipo "MISURA 1/10" così uno si regolava...
Adesso viene il bello. Ho scovato in giro un mio amico che usava (quando era al poli) uno strumento simile al tuo.
Mi ha detto che di solito si invia un segnale di fine trasmissione (che comunemente è il 26 o CTRL+Z ma potrebbe essere uno usato a caso). ora bisogna prendere due o più output originali e compararli bit a bit (perlomeno gli ultimi) per vedere se la loro parte finale ha qualcosa in comune.
Se la troviamo BANG è fatta, basta poi impostare la propietà "Stop Bits" del controllo seriale.
Secondo me è l'unica cosa che puoi ancora tentare.
Magari gli esperti che bazzicano su questo forum hanno idee migliori, ma questo è tutto quello che so dirti.

Ciao ciao.

Edit: Mamma mia che nostalgia a rivedere Ohm e i suoi allegri amici, sniff...

Spartacus Profilo | Newbie

ciao
Prima di tutto non ti devi scusare mi stai aiutando quindi sono io che ti devo ringraziare.
Poi ti dirò che andando a leggermi il micro contenuto nello strumento e pistolando un po in assembler mi pare di aver capito che lo strumento inviare un ETX (carattere ascii 03H) adesso però mi sorge un altro piccolo problema con string.Contains non riesco a verificare la presenza del carattere ETX) hai qualche suggerimento al riguardo?
Grazie ancora

Anonimo Profilo | Senior Member

>ciao
>Prima di tutto non ti devi scusare mi stai aiutando quindi sono
>io che ti devo ringraziare.

Prego
Purtroppo è una mia abitudine scusarmi per il ritardo delle risposte, perchè sono abituato a rispondere subito è so quanto sia fastidioso aspettare e aspettare per una risposta

>Poi ti dirò che andando a leggermi il micro contenuto nello strumento
>e pistolando un po in assembler mi pare di aver capito che lo
>strumento inviare un ETX (carattere ascii 03H) adesso però mi
>sorge un altro piccolo problema con string.Contains non riesco
>a verificare la presenza del carattere ETX) hai qualche suggerimento
>al riguardo?
>Grazie ancora

Ti conviene convertire la stringa in HEX con una cosa del tipo:

public string ConvertToHex(string asciiString) { string hex = ""; foreach (char c in asciiString) { int tmp = c; hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString())); } return hex; }

Oppure usare il metodo String.Contain e passargli il valore ricordandosi che i valori esadecimali hanno la notazione 0x[valore esadecimale] quindi nel tuo caso "0x03H".

O anche prova a impostare la variabile "Stop bits" del controllo seriale anche se non mi piace molto come soluzione.

Vedi tu quale dei tre ti è più comodo.

Visto? Alla fine una scappatoia l'hai trovata! Se vuoi un consiglio però ti conviene cercare quel valore solo verso la fine della stringa per evitare "falsi positivi" (ovvero alcuni dati corrispondono a quel determinato valore e rischieresti di troncare prima il messaggio).

Ciao.

Spartacus Profilo | Newbie

Grazie ancora finalmente ho risolto quel problema.

Cristian

Anonimo Profilo | Senior Member

Di nulla
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5