Newsgroup: it.comp.lang.c++
Titolo: seriali?

Esiste una libreria c++ per leggere e scrivere su porte seriali?
grazie

 dettagliata...
Scusate se mi intrometto ... ma anch'io ho lo stesso problema: Sto
scrivendo un'applicazione che usera' porte seriali, che girera' sotto W98
(forse da trasportare poi su NT o XP) e come C++ uso Builder C++ Borland.
Ho cominciato a lavorare col Builder C++ da meno di 1 settimana, prima
usavo Turbo C sotto DOS.
Grazie x eventuali suggerimenti sul controllo porte.
Ciao Alfredo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 usavo Turbo C sotto DOS.
se devi lavorare sotto windows NT o XP non  devi preoccuparti del tipo di
carattere ( Unicode o ASCII )
o w98, se lavori sotto winCE ricordati che supporta solo unicode e quindi
ricordati di usare i TCHAR e che il nome della porta deve essere seguito da
i due puntini ":" es TCHAR szPorta[6] = TEXT("COM1:");
in questo caso allora ricorati pero' di dichiarare la macro _UNICODE,
UNICODE, se vuoi sapere di piu' fammelo sapre...
con la CreateFile apri la porta ( windows in questo caso ragiona come Unix,
"Everithing is a file") e quindi con la CreateFile apri un file, la seriale,
(non so, forse anche la parallela) ecc...
quindi
 TCHAR szPorta[6] = TEXT("COM1:");
 HANDLE hSeriale = INVALID_HANDLE_VALUE;
hSeriale = CreateFile(szPorta, GENERIC_RED |
GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if ( hSeriale != INVALID_HANDLE_VALUE)
    CloseHandle(hSeriale); // libero la risorsa se non mi serve per altre
operazioni...
ATTENZIONE: tre cose,
1) se ad esempio la porta e' occupata dal mouse o altro e la vuoi utilizzare
tu ad ogni costo,
al posto di OPEN_EXISTING usa l'attributo CREATE_ALWAYS, che sovrascrive le
impostazioni scritte sul registry...
2) INVALID_HANDLE_VALUE NON EQUIVALE, come si potrebbe pensare, a NULL (
cioe' 0, dichiarato in stdlib.h ), bensi' a 1 !!!
// GRAVE ERRORE
HANDLE hSerial = INVALID_HANDLE_VALUE;
if ((hSerial = CreateFile(...)) == NULL)
{
    // blocco di istruzioni
}
 ... codice per gestire l'errore perche' la CreateFile() ha fallito...
In questo caso la CreateFile ha fallito, ma tu non te ne accorgi, infatti
non restituendo NULL bensi' INVALID_HANDLE_VALUE, il codice del blocco
dentro il costrutto if non verra' mai processato!!!
3) presta molta attenzione al 4° parametro, ovvero LPSECURITY_ATTRIBUTES
In realta' questo attributo e' molto importante, perche' TUTTE LE API che
contengono un
puntatore alla struttura SECURITY_ATTRIBUTES, sono oggetti KERNEL di
windows,
cioe' blocchi di memoria assegnati dal kernel e che SOLO il kernel puo'
accedervi.
Windows 98, 95, ME non implementano questa protezione, pero' se si vuole
scrivere
codice che possa girare anche sotto Windows NT o 2000 o XP, questo attributo
e'
molto importante, Infatti se viene passato come valore NULL e la piattaforma
e'
Windows NT o 2000 o XP, allora avranno accesso completo all'oggetto kernel
(CreateFile())
solo il creatore dell'oggetto e i membri del gruppo administrator.
Questo parametro quindi e' utilissimo se si vuole limitare l'accesso
all'oggetto kernel
cosi' creato o si vuole che questo oggetto sia ereditabile da un processo
child.
In questo caso la struttura andrebbe settata nel seguente modo:
SECURITY_ATTRIBUTES saFlag;
szFlag.nLength = sizeof(saFlag);
saFlag.lpSecurityDescriptor = NULL;
// IMP. oggetto kernel ereditabile da un processo secondario, basta che ci
sia tra i due
// il rapporto principale - secondario ( parent - child )
saFlag.bInheritHandle = TRUE;
es.
HANDLE hSerial = CreateFile(,,,&saFlag,,,);
Spesso, e mi e' successo recentemente, quando programmiamo per w98 ci
dimentichiamo di utilizzare questa struttura e poi sotto windows 2000 o
simili ci troviamo nei casini...
Spero di esserti stato utile, ciao Stefano

 ha scritto nel messaggio
news:ah77jk$8f2$1...@lacerta.tiscalinet.it...


 (non so, forse anche la parallela) ecc...
Sicuramente sbaglio qualcosa, ma lavorando con Borland C++ Builder6 non
riesco a trovare la funzione CreateFile, sai darmi indicazioni anche su
questo?
Grazie in anticipo, Alfredo


[...]
Vado a naso. Ditemi se sparo cazzate.
Sotto Linux le porte seriali sono mappate come file, rispettivamente
/dev/ttyS0 per la COM1 e /dev/ttyS1 per la COM2.
Leggendo e scrivendo da questi file dovresti ottenere cio' che vuoi.
Aspetto conferme da chi e' + ferrato in materia.
-- 
"Con questo cosa voglio dire? Non lo so. Pero' c'ho ragione."
(Palmiro Cangini)

 /dev/ttyS0 per la COM1 e /dev/ttyS1 per la COM2.
e' vero, pero' speravo che ci fosse qualcosa per il settaggio delle porte
direttamente in c++
(parita', BAUDRATE ecc.)