Vai al contenuto

Invio stringa dati su porta seriale

Home Forum Programmazione IEC 61131 (LogicLab) Invio stringa dati su porta seriale

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #84507
    Anonimo
    Inattivo

    In una mia applicazione devo invia un comando su porta seriale. Ho realizzato questo programma:

    VAR
        Send : BOOL; (* Comando invio *)
        CFrame : ARRAY[0..7] OF BYTE; (* Frame comando *)
        Sp : SysSerialPort; (* Serial port management *)
    END_VAR
    
        IF (SysFirstLoop) THEN
            Sp.COM:=ADR('COM0'); //COM port definition
            Sp.Baudrate:=19200; //Baudrate
            Sp.Parity:='E'; //Parity
            Sp.DataBits:=8; //Data bits
            Sp.StopBits:=1; //Stop bits
            Sp.DTRManagement:=DTR_AUTO_WO_TIMES; //DTR management
            Sp.DTRComplement:=FALSE; //DTR complement
            Sp.EchoFlush:=FALSE; //Received echo flush
            Sp.DTROnTime:=0; //DTR On time delay (mS)
            Sp.DTROffTime:=0; //DTR Off time delay (mS)
            Sp.FlushTm:=0; //Flush time (mS)
            Sp.RxSize:=0; //Rx buffer size
            Sp.TxSize:=0; //Tx buffer size
        END_IF;
    
        Sp(Open:=TRUE); //Serial port management
    
        // Eseguo invio comando
    
        IF (Send) THEN
            Send:=FALSE; //Comando invio
    
            CFrame[0]:=16#41; //A
            CFrame[1]:=16#54; //T
            CFrame[2]:=16#44; //D
            CFrame[3]:=16#41; //A
            CFrame[4]:=16#0D; //<CR>
            CFrame[5]:=16#30; //0
            CFrame[6]:=16#44; //D
            CFrame[7]:=16#0D; //<CR>
    
            eTO_JUNK(Sysfwrite(ADR(CFrame), 1, 8, Sp.File));
        END_IF;

    Il programma funziona ma chiedevo se è possibile ottimizzare il codice inviando direttamente la stringa senza doverla appoggiare sulla variabile CFrame.

    #84515
    Sergio Bertana
    Amministratore del forum

    Ci sono diversi modi per ottenere quello che hai chiedi. Ecco la parte di programma interessata con due diverse opzioni di invio:

        // Eseguo invio comando
    
        IF (Send) THEN
            Send:=FALSE; //Comando invio
            eTO_JUNK(SysVfprintf(Sp.File, ADR('%s'), STRING_TYPE, ADR('ATDA$r0D$r')));
            eTO_JUNK(Sysfwrite(ADR('ATDA$r0D$r'), 8, 1, Sp.File));
        END_IF;
    • Nella prima ipotesi ho utilizzato la funzione SysVfprintf, indicando in Format il tipo stringa %s. In questo modo viene inviata la stringa calcolandone automaticamente la lunghezza.
    • Nella seconda ipotesi ho utilizzato come nel tuo esempio la funzione Sysfwrite, ma in questo caso ho dovuto indicarne la lunghezza di 8 caratteri in Size.
Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.