Quattro funzioni molto comode per lo scambio di informazioni con dispositivi collegati attraverso la porta seriale.
Apertura, chiusura invio e ricezione di dati utilizzando le api di sistema (Win32) CreateFile(),ReadFile(), WriteFile() e CloseHandle().
Le impostazioni sulla comunicazione come il baudrate, i bit di stop, la parità i contorlli di handshaking e gli altri parametri
specifici devono essere modificati a seconda del proprio protocollo di comunicazione modificando i campi della strauttura DCB.
La documentazione completa di questa struttura è reperibile all'indirizzo:
Inizializzazione porta:
HANDLE initSerialPort (const char* COMx,unsigned int msTimeout) { // Gestore della connessione seriale HANDLE serialPort; // Gestore dei Timeout COMMTIMEOUTS cto; // Settaggi per la comunicazione seriale DCB dcb; memset(&dcb,0,sizeof(dcb)); // Imposto i valori per i Timeout cto.ReadIntervalTimeout = msTimeout; cto.ReadTotalTimeoutMultiplier = msTimeout; cto.ReadTotalTimeoutConstant = msTimeout; cto.WriteTotalTimeoutMultiplier = msTimeout; cto.WriteTotalTimeoutConstant = msTimeout; // Inizializzo la porta seriale serialPort = CreateFile (COMx, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); // Imposto le proprietà della connessione if (serialPort == INVALID_HANDLE_VALUE) return INVALID_HANDLE_VALUE; // Imposto il Timeout SetCommTimeouts(serialPort, &cto); // Imposto i parametri per la comunicazione dcb.DCBlength = sizeof(dcb); dcb.BaudRate = CBR_19200; dcb.Parity = NOPARITY; dcb.ByteSize = 8; dcb.StopBits = ONESTOPBIT; dcb.fBinary = 1; dcb.fDtrControl = DTR_CONTROL_ENABLE; dcb.fRtsControl = RTS_CONTROL_ENABLE; dcb.fAbortOnError = TRUE; dcb.fOutX = FALSE; dcb.fInX = FALSE; dcb.fOutxCtsFlow = TRUE; dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; dcb.fOutxDsrFlow = FALSE; dcb.fDtrControl = DTR_CONTROL_ENABLE; if (!SetCommState (serialPort, &dcb)) serialPort = INVALID_HANDLE_VALUE; return serialPort; }
|
Scrittura e lettura:
BOOL writeToSerialPort(HANDLE serialPort,BYTE *toWrite,DWORD byteLength) { DWORD written; if (!WriteFile(serialPort,toWrite,byteLength,&written,NULL)) return FALSE; if (byteLength != written) return FALSE; // Non sono stati scritti tutti i bytes return TRUE; } BOOL readFromSerialPort(HANDLE serialPort,BYTE *toRead,DWORD byteLength) { DWORD readed; if (!ReadFile(serialPort,toRead,byteLength,&readed,NULL)) return FALSE; if (byteLength != readed) return FALSE; // Non sono stati letti tutti i bytes return TRUE; }
|
Attenzione, nella funzione di lettura non viene fatto nessun controllo sulla dimensione massima del buffer in ricezione prima di scriverci sopra!
Chiusura porta:
void closeSerialPort(HANDLE serialPort) { CloseHandle(serialPort); }
|
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include "serialCOM.h" // Libreria serialCOM int main() { HANDLE port; BYTE buffer[2]; DWORD lng; // Apro la connessione sulla COM1 con timeout mezzo secondo port = initSerialPort ("COM1",500); if (port == INVALID_HANDLE_VALUE) { printf("Errore apertura connessione\n"); return 1; } // Riempo il buffer da scrivere: buffer[0] = 'A'; buffer[1] = 'B'; lng = 2; if (!writeToSerialPort(port,buffer,lng)) // Imposto la dimensione del buffer dei dati da leggere lng = 3; if (!readFromSerialPort(port,buffer,lng)) else printf("Dati: %d %d %d\n",buffer [0],buffer [1],buffer [2]); // Chiudo la connessione closeSerialPort(port); return 0; }
|
 | | Downloads: 438 | | | |  | | Downloads: 407 | | | |  | | Downloads: 342 | | | |
|