Newsgroup: it.comp.lang.c++
Titolo: Aiuto porta seriale con C++ Builder 3

Salve a tutti
dovrei controllare la porta seriale del PC tramite C++ Builder 3, mi
serve poter comandare la linea RTS, testare CD e ovviamente poter
trasmettere e ricevere una chiamata quando arriva un dato.
Non mi sembra che gli stumenti disponibili permettano un controllo a
così basso livello ... o sbaglio? 
E' brutto essere alle prime armi :-(
Grazie a chiunque vorrà diradare un po' della nebbia che mi circonda.

 trasmettere e ricevere una chiamata quando arriva un dato.
Le possibilità per lavorare con la seriale sotto Win32 le seguenti:
1) Utilizzare le API
2) MFC
3) Utilizzare un componente software, che, data la mia scarsa conoscenza
dell'ambiente Borland, potrebbe benissimo essere già presente con il
compilatore. Sicuramente comunque ne esistono in commercio di già pronti.
Le API per la gestione della seriale sono molto complete, e, superato il
primo momento di sconforto, è facile costruirci intorno un componente o
una classe.
Per le API riportate studiati l'help in linea.
Per prima cosa devi aprire la porta:
    ::CreateFile(...)  il primo parametro è "COM1" o "COM2".
Poi vanno settate la velocità, bit  di stop/parità/ecc. Per fare ciò si
usa una struttura DCB, che è piuttosto voluminosa (meglio! più opzioni
possibili!). Esista una API che ci riempie la struttura con parametri di
default, è ::BuildCommDCB().
Poi si settano i parametri che interessa modificare, e si chiama
::SetCommState() per ufficializzare il tutto.
Per sapere se ci cono problemi sulla linea usa ::ClearCommError().
Ora si può spedire byte con ::WriteFile(), e riceverli con ::ReadFile().
Per quest'ultima occhio a quanto viene detto nell'SDK relativamente al
flag OVERLAPPED.
Ci sono poi funzioni per il settaggio dei vari timeout, e la gestione
automatica di maschere per la terminazione di operazioni I/O. Per le
prime si usa ::SetCommTimeouts() e simili, per le seconde si usa
::SetCommMask().
Infine ci sono le API per la creazioni di thread e di eventi di ascolto,
per rispondere in modo concorrente.
Quando hai finito, ricordati di chiudere la porta, 'ché fa corrente:
CloseHandle(handle), dove handle è il riferimento restituito ovviamente
da CreateFile().
Infine ci sono le MFC, che incapsulano gestione di thead e comunicazioni
dentro utili classi, che chiamano le API qui sopra. Se non mi sbaglio
però il C++ Builder 3 ha le MFC, ma non ha l'help per il framwork,
rendendo quindi la sua presenza praticamente inutile. Questo è il motivo
principale per cui a suo tempo ho litigato (e subito disinstallato)
questo compilatore, tornando all'eterno (nel senso della velocità di
compilazione) Visual C++.
Roberto Cavada

 così basso livello ... o sbaglio?
IMHO, se devi scendere a livello così basso, le API non bastano, poichè sono
fatte per usare i protocolli standard.
Devi per forza scrivere un device driver, e la cosa non è semplice.
A suo tempo avevo realizzato un driver DOS per la parallela bidirezionale
(che il BIOS e il DOS non gestivano ancora), e ho dovuto usare le porte I/O
e un po' di Assembler, oltre ad un metodo per le temporizzazioni precise
(tenere alto il segnale sul pin 1 per almeno 150 ms, poi abbassarlo per 300
ms, ecc.).
Sotto windows questo non funziona, poichè protegge le risorse HW. In
win95/98 puoi partire con il DOS, con NT è proprio impossibile.
--
Alessandro Monti

Grazie Roberto per le informazioni, ci sto lavorando, ho ancora
qualche problemino con il controllo del segnale RTS, ma spero di
risolvere.
Certo che per uno come me, abituato a scrivere in assembler (per micro
Motorola) questa lontananza dai registri di programmazione dei
dispositivi periferici è davvero frustrante ... comunque cercherò di
sopravvivere :-)
grazie ancora e saluti. 

 Grazie a chiunque vorrà diradare un po' della nebbia che mi circonda.
Ho trovato in Internet un componente che lo faceva, si chiama TPort, ma non
ricordo dove scaricarlo...se vuoi ti dò l'Email dell'autore, così puoii
chiedergli di inviartelo