Potevo non parlarne? :-)
Una classe sotto vari punti di vista molto "familiare" disponibile anche come componente nella toolbox di Visual Studio 2005 all'interno del gruppo "Components".
Chi si occupa di comunicazioni seriali troverà tutto il necessario nella classe System.IO.Ports.SerialPort, il fatto che sia stato creato un namespace Ports mi fa ipotizzare che in futuro avremo altri tipi di porte apparire in questo namespace, anche se, senza dubbio, ciò accadrà dopo il rilascio del frameworks 2.0.
Cito solo alcuni dettagli interessanti:
- La classe espone un metodo statico GetPortNames() che ritorna un array di stringhe con i nomi delle porte seriali disponibili nella forma "COMx".
- La proprietà BaseStream espone uno stream che possiamo utilizzare con le altri classi presenti in System.IO, ad esempio volendo dialogare con un modem, oltre ad usare i vari metodi WriteXXX della classe stessa è possibile scrivere:
Dim sw As StreamWriter = New StreamWriter(SerialPort1.BaseStream)
sw.WriteLine("ATZ")
sw.Flush()
- DataReceived è l'evento che viene generato quando nel buffer di ingresso della porta sono presenti dei dati la cui quantità è maggiore del valore impostato nella proprietà ReceivedBytesThreshold, volendo ad esempio leggere tutto il contenuto del buffer è perciò possibile scrivere qualcosa tipo:
Private
Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
If (e.EventType = SerialData.Chars) Then Console.WriteLine(SerialPort1.ReadExisting)
End Sub
Un dettaglio molto importante che la documentazione MSDN si è dimenticata di citare è che l'evento viene generato in thread secondario e quindi se all'interno di questo evento accedete a controlli windows forms, eseguite l'opportuno marshaling.
-
Oltre a DataReceived troviamo gli eventi ErrorReceived e PinChanged, quest'ultimo viene generato quando lo stato delle varie linee di controllo (CD,CTS,DSR,Ring) cambia oppure in ingresso viene identificato un comando Break.