2013-04-03 29 views
22

Ho eseguito la connessione seriale RS-232 in C++ utilizzando il compilatore a 16 bit (stavo usando Turbo C++ IDE). Comprendeva il file di intestazione bios.h che contiene tutte le funzioni richieste per la lettura dei valori dalla porta. Ora voglio leggere il valore dalla porta seriale usando il compilatore Mingw C++ a 32 bit. Sto usando Dev CPP come IDE. Qui non ho trovato bios.h. Sono disponibili file di intestazione speciali per questo scopo in Mingw? Sto usando il compilatore a 32 bit ora perché nel mio progetto universitario ho avuto modo di utilizzare la gestione delle eccezioni che suppongo non sia supportata in Turbo C. Please help me out.Connessione porta seriale (RS -232) in C++

+0

Credo che non sarà a disposizione per lavorare da modalità utente con COM direttamente come lo era nel . Se si desidera utilizzare la vecchia connessione, è necessario continuare a utilizzare il compilatore a 16 bit ed eseguire l'app in qualche dos emulatore, ad es. Dosbox. Trasmetterà la COM fisica alle interfacce bios.h. – zabulus

+0

Non riuscivo a capire completamente cosa volevi dire? Posso eseguire il mio file .exe del mio programma che è stato sviluppato in Mingw in DosBox? Se sì come? – iammurtaza

+0

Nella tua domanda hai parlato di . Sembra che questo file sia stato utilizzato in ambiente DOS per comunicare con la porta COM. Questo modo di comunicare su finestre moderne ora non è disponibile. Presumo che tu voglia eseguire il compile exe in ambiente Windows. In questo caso dovresti usare un'altra API. Ad esempio, google per "CreateFile COM1" – zabulus

risposta

34

prega di dare un'occhiata qui:

1)È possibile utilizzare questo con Windows (incl. MinGW) così come Linux. Alternativa puoi usare il codice solo come esempio.

2)Step-by-step tutorial come utilizzare le porte seriali sulle finestre

3)È possibile utilizzare questo letteralmente su MinGW

Ecco alcuni molto, molto codice semplice (senza alcuna gestione degli errori o impostazioni):

#include <windows.h> 

/* ... */ 


// Open serial port 
HANDLE serialHandle; 

serialHandle = CreateFile("\\\\.\\COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 

// Do some basic settings 
DCB serialParams = { 0 }; 
serialParams.DCBlength = sizeof(serialParams); 

GetCommState(serialHandle, &serialParams); 
serialParams.BaudRate = baudrate; 
serialParams.ByteSize = byteSize; 
serialParams.StopBits = stopBits; 
serialParams.Parity = parity; 
SetCommState(serialHandle, &serialParams); 

// Set timeouts 
COMMTIMEOUTS timeout = { 0 }; 
timeout.ReadIntervalTimeout = 50; 
timeout.ReadTotalTimeoutConstant = 50; 
timeout.ReadTotalTimeoutMultiplier = 50; 
timeout.WriteTotalTimeoutConstant = 50; 
timeout.WriteTotalTimeoutMultiplier = 10; 

SetCommTimeouts(serialHandle, &timeout); 

Ora è possibile utilizzare WriteFile()/ReadFile() per scrivere/leggere byte. Non dimenticare di chiudere il collegamento:

CloseHandle(serialHandle); 
+1

Penso che dovresti chiamare 'SetCommState' piuttosto che' GetCommState' una seconda volta? – Ben

+0

Hai ragione, è un errore - grazie per il suggerimento, l'ho risolto. – ollo

+0

Hai detto che puoi anche usarlo su Linux, ma tu "# include "? Non sono sicuro che funzionerà/non funzionerà su Linux/OSX. – Paul

Problemi correlati