2013-04-03 9 views
22

Wykonałem połączenie portu szeregowego RS-232 w C++ za pomocą 16-bitowego kompilatora (korzystałem z IDE Turbo C++). Zawiera plik nagłówkowy bios.h, który zawiera wszystkie wymagane funkcje do odczytu wartości z portu. Teraz chcę odczytać wartość z portu szeregowego przy użyciu 32-bitowego kompilatora Cing w C++. Używam Dev CPP jako mojego IDE. Tutaj nie mogłem znaleźć bios.h. Czy są dostępne specjalne pliki nagłówkowe w Mingw? Używam teraz kompilatora 32-bitowego, ponieważ w moim projekcie na uczelni używam obsługi wyjątków, które, jak sądzę, nie są obsługiwane w Turbo C. Proszę, pomóżcie mi.Połączenie szeregowe (RS-232) w C++

+0

myślę, że nie będą dostępne do pracy z trybu użytkownika z COM bezpośrednio, jak to było w . Jeśli chcesz użyć starego połączenia, powinieneś nadal używać 16-bitowego kompilatora i uruchamiać aplikację w emulatorach dos, to jest dosbox. Prześle fizyczny port COM do interfejsów bios.h. – zabulus

+0

Nie mogłem zrozumieć, co miałeś do powiedzenia? Czy mogę uruchomić mój plik .exe mojego programu, który został opracowany w Mingw w DosBox? Jeśli tak, to w jaki sposób? – iammurtaza

+0

W swoim pytaniu opowiedziałeś o . Wygląda na to, że ten plik był używany w środowisku DOS do komunikowania się z portem COM. Ten sposób komunikacji w nowoczesnych oknach nie jest obecnie dostępny. Zakładam, że chcesz, aby kompilator exe był uruchamiany w środowisku Windows. W takim przypadku powinieneś użyć innego API. tj. google dla "CreateFile COM1" – zabulus

Odpowiedz

34

Proszę spojrzeć tutaj:

1)Możesz użyć tego w Windows (w tym. MinGW) oraz Linux. Alternatywnie możesz użyć tylko kodu jako przykładu.

2)Tutorial krok po kroku jak korzystać z portów szeregowych na oknach

3)można użyć tego dosłownie na MinGW

Oto niektóre bardzo prosty kod (bez obsługi błędów i ustawień):

#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); 

Teraz możesz użyć WriteFile()/ReadFile() do zapisu/odczytu bajtów. Nie zapomnij zamknąć połączenie:

CloseHandle(serialHandle); 
+1

Myślę, że powinieneś nazwać 'SetCommState' zamiast' GetCommState' po raz drugi? – Ben

+0

Masz rację, to pomyłka - dzięki za podpowiedź, naprawiłem to. – ollo

+0

Mówisz, że możesz go również używać w systemie Linux, ale "#include "? Nie jestem pewien, czy to/nie zadziała w systemie Linux/OSX. – Paul