Vai al contenuto

Gestione stringhe da seriale e da connessione UDP

Home Forum Programmazione IEC 61131 (LogicLab) Gestione stringhe da seriale e da connessione UDP

Stai visualizzando 5 post - dal 1 a 5 (di 5 totali)
  • Autore
    Post
  • #37283
    Michele
    Partecipante

    Aggiungo al post precedente, oggi trovo sul manuale dello slimline la funzione SysGetRxBSize che torna la dimensione del buffer seriale ed eseguendo:

    BuffLen:=SysGetRxBSize(Fp[0]);

    Ho effettivamente un valore di 256. Ovviamente iBuffLen è un INT. Come posso aumentare tale buffer seriale visto che devo ricevere almeno tra i 2 e 3 KByte.

    #35230
    Michele
    Partecipante

    Salve, ho un problema con le stringhe, devo ricevere dalla seriale 2Kb di dati, inseririli in una variabile ed inviarli via UDP. Ho definito una var STRINGA RxStr a 2048 ma non ricevo tutti i 2KB che dal PC invio.

    Ho controllato l’output seriale del PC con un analizzatore logico e vedo passare tutti i 2KB quindi il problema sta sullo slimline. Ecco il codice

    i:=Sysfread(ADR(RxStr ), 2048, 1, Fp[0]); (* Fp[0]  è il ptr handle della seriale *)
    NrOfCh:=SysUDPSktSend(Fp[1], ADR(RxStr ), LEN(RxStr ), ‘192.168.0.10’, 120);

    Sul PC tramite LAN riprendo i dati letti dalla seriale ma ricevo un solo carattere.

    #37284
    Sergio Bertana
    Amministratore del forum

    C’è un pò di confusione, vediamo di chiarire il concetto della gestione delle comunicazioni seriali sullo SlimLine. Il buffer seriale è effettivamente di 256 bytes, ma non è necessario aumentarne la dimensione. Il buffer seriale serve a contenere i dati che arrivano dalla seriale solo per dare il tempo al programma utente di leggerli.

    Quindi considerato che il programma utente (Task di background) ha come tempi di esecuzione valori tipici di pochi mS è evidente che in quel tempo può essere ricevuto solo qualche carattere. Ora il tuo problema è di leggere i dati dal buffer di ricezione e di trasferirli nella stringa che hai definito.

    Se vuoi ricevere l’intera stringa, il problema è capire quando la stringa è terminata, può essere utilizzato un carattere delimitatore (Se esiste), oppure attendi un timeout, se non ricevuti caratteri per un tempo definito si considera la stringa ricevuta e si invia sul socket UDP.

    Attenzione anche in trasmissione devi eseguire uno spooling dei dati in uscita caricando nel buffer di trasmissione solo i caratteri che possono essere contenuti. Per darti una idea di qaunto detto ti allego la stampa ed il programma sorgente di un dimostrativo.

    #37288
    Michele
    Partecipante

    Scusa ma non riesco ad ottenere il risultato voluto. Non riesco a prendere tutti i byte che arrivano dalla seriale. La funzione SysGetIChars(Fp) mi torna sempre 255 e mai ad esempio 1024 se invio 1024 byte alla seriale dello slimline il problema e che anche creando un repository non vado oltre 255 anche il sw di test che gentilmente mi hai creato si ferma sempre a 255.

    Ho notato che anche il buffer di uscita della funzione SysUDPSktSend è sempre al massimo 255 se vado oltre il device si resetta.

    #37289
    Sergio Bertana
    Amministratore del forum

    Andiamo con ordine e vediamo di risolvere i problemi sulla ricezione seriale, poi analizzeremo quelli sulla connessione UDP. Il fatto che la funzione SysGetIChars torni al massimo 255 l’ho spiegato prima, quindi è normale. Il programma che ho postato infatti esegue il buffering dei dati ricevuti proprio per poter suddividere la ricezione dei tuoi 2048 bytes in pacchetti massimo di 255 bytes.

    Per quanto riguarda la trasmissione UDP puoi trasmettere pacchetti di 1000 bytes, quindi se il pacchetto ricevuto è di dimensioni maggiori dovrai suddividerlo. Ti allego la stampa ed il programma sorgente di un programma che bufferizza i dati in ricezione e trasmette il pacchetto ricevuto su UDP.

    Utilizzando Toolly puoi inviare un file testo da 2040 caratteri (20 righe da 100 caratteri <CR><LF>) sulla seriale verso lo SlimLine e dal server UDP vedrai i dati ricevuti dalla connessione UDP (Vedi screenshot). I dati sono trasmessi dallo SlimLine dopo 1 secondo che non riceve più dati dalla porta seriale. Come puoi notare  dallo screenshot il debug della variabile TxChrs indica i bytes ricevuti e poi ritrasmessi su connessione UDP.

Stai visualizzando 5 post - dal 1 a 5 (di 5 totali)
  • Devi essere connesso per rispondere a questo topic.