Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    33

    Delphi e dati in Real time sulla seriale

    Ciao a tutti,
    Volevo chiedere se qualcuno può darmi dritte su Delphi.
    In particolare mi interesserebbe sapere se con Delphi c'è qualche comando che mi permette di scaricare dati da un dispositivo collegato alla porta Com del mio pc.
    So che in VB il comando è MScomm.
    Ringrazio anticipatamente quanti interverranno...

    Ciao
    Fabio
    Fabio

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    In Delphi non esiste già un controllo incorporato, come in VB, per la gestione delle porte seriali. Tuttavia, l'oggetto MSComm che hai citato dovrebbe essere un controllo ActiveX presente sulla macchina che puoi eventualmente importare all'interno dell'ambiente Delphi.

    In alternativa, puoi prendere in considerazione l'uso di una suite estremamente potente per la gestione di seriali, fax, modem, ecc.
    Si tratta di Turbo Power Async Professional, disponibile come OpenSource da quest'anno. Trovi tutte le informazioni sul sito ufficiale.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    ioProgrammo

    Aggiungo un'altra notizia: mi hanno segnalato che sul numero di questo mese di ioProgrammo c'è uno speciale riguardante l'interfacciamento del PC con dispositivi seriali e paralleli usando Delphi.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    l'MSComm che citi è, come accennato alka, un OCX che puoi importare tranquillamente in delphi.

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da bDaniele
    l'MSComm che citi è, come accennato alka, un OCX che puoi importare tranquillamente in delphi.
    Il problema è che non si trova installato di default in Windows.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 1999
    Messaggi
    88
    In merito a quanto detto da alka, è vero che sulla rivista Io Programmo ci sono una serie di articoli su come interfacciarsi con Delphi, ma usa un accesso diretto alla porta (con 3 istruzioni assembler), perciò sotto Windows NT e seguenti non dovrebbe funzionare.

    Ciao
    Paolomat
    VB - Java - C/C++ - VC - CORBA -JDBC

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Hai dato un'occhiata alla suite Turbo Power AsyncPro che ti ho segnalato?

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    33
    ho dato un'occhiata alla suite, ma non ne ho cavato molto...
    Ma se io uso l'ocx mscomm in VB posso leggere direttamente la stringa e lavorarci se il mio pc lavora con Windows Xp...
    Questo problema di programmazione mi sta facendo impazzire...

    Ciao
    Fabio

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 1999
    Messaggi
    88
    Si con MSComm riesci a monitorare la seriale senza problemi e funziona su tutti i sistemi operativi Microsoft.
    Purtroppo Delphi non l'ho mai usato perciò non posso essere di molto aiuto. Comunque stasera guardo nelle diverse riviste se trovo qualcosa per Delphi.

    Posso dirti che sotto Win XP se vuoi usare direttamente la seriale saltando il SO, devi caricare prima dei appositi programmi. (Ho dovuto fare così per far girare un vecchio programma in C).

    Ciao
    VB - Java - C/C++ - VC - CORBA -JDBC

  10. #10
    è circa un anno che scrivo applicazioni di interfaccia tra PC e componenti hardware collegati sulla seriale e anche con XP posso accedere direttamente alla porta e funziona bene.

    Le istruzioni assembler che citi, probabilmente sono ad un livello troppo basso x avere la compatibilità con tutti gli OS.

    Se vuoi ti mando l'ocx di mscomm, o un componente veramente simile, forse più performante, compreso di sorgenti e programma applicativo demo.
    Ho guardato la suite che citava alka è non è niente male.

    Ora la scelta è a te, se hai ancora problemi prova ad essere più dettagliato.

    se vuoi accedere direttamente alla porta x te non è altro che un file:

    codice:
    var ComFile: THandle;
    
    {$R *.DFM}
    
    function OpenCOMPort: Boolean;
    var DeviceName: array[0..80] of Char;
    begin
    
      StrPCopy(DeviceName, 'COM1:');
    
      ComFile := CreateFile(DeviceName,
        GENERIC_READ or GENERIC_WRITE,
        0,
        nil,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        0);
    
      if ComFile = INVALID_HANDLE_VALUE then
        Result := False
      else
        Result := True;
    end;
    
    
    function SetupCOMPort: Boolean;
    const 
      RxBufferSize = 256;
      TxBufferSize = 256; 
    var
      DCB: TDCB; 
      Config: string;
      CommTimeouts: TCommTimeouts;
    begin
      Result := True;
    
      if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
        Result := False;
    
      if not GetCommState(ComFile, DCB) then
        Result := False;
    
      Config := 'baud=9600 parity=e data=8 stop=1';
    
      if not BuildCommDCB(@Config[1], DCB) then
        Result := False;
    
      if not SetCommState(ComFile, DCB) then
        Result := False;
    
      with CommTimeouts do
      begin 
        ReadIntervalTimeout         := 0;
        ReadTotalTimeoutMultiplier  := 0;
        ReadTotalTimeoutConstant    := 500;
        WriteTotalTimeoutMultiplier := 0; 
        WriteTotalTimeoutConstant   := 500;
      end; 
    
      if not SetCommTimeouts(ComFile, CommTimeouts) then
        Result := False; 
    end;
    
    procedure SendText(s: string);
    var BytesWritten: DWORD;
    begin
      WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
    end;
    
    function ReadText: string;
    var 
      d: array[1..80] of Char;
      s: string;
      i: Integer;
      BytesRead:dword;
    begin
      Result := '';
      if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil) then
      begin
        { Raise an exception }
      end;
      s := '';
      for i := 1 to BytesRead do s := s + d[I];
      Result := s;
    end;
    
    
    procedure CloseCOMPort;
    begin
      CloseHandle(ComFile);
    end;
    In ogni modo l'aiuto di un componente già testato da altri è consigliabile.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.