2013-04-03 28 views
22

C++'da 16-bit derleyici kullanarak seri bağlantı noktası RS-232 bağlantısı yaptım (Turbo C++ IDE kullanıyordum). Bağlantı noktasından değerleri okumak için gereken tüm işlevleri içeren bios.h başlık dosyasını içerir. Şimdi C++ 32-bit Mingw derleyicisini kullanarak seri porttan değer okumak istiyorum. IDE olarak Dev CPP kullanıyorum. Burada bios.h bulunamadı. Mingw'de bu amaç için mevcut herhangi bir özel başlık dosyası var mı? Şimdi 32-bit derleyiciyi kullanıyorum çünkü benim üniversite projemde Turbo C'de desteklenmediğini düşündüğüm Exception işlemlerini kullanmam gerekiyor. Lütfen bana yardımcı olun.C++ 'da Seri Bağlantı Noktası (RS -232) Bağlantısı

+0

Ben bunu olduğu gibi doğrudan COM ile kullanıcı modundan çalışmaya kullanılamayacaktır düşünüyorum. Eski bağlantıyı kullanmak istiyorsanız, 16 bit derleyiciyi kullanmaya devam etmeli ve uygulamanızı bazı dos emülatörlerde, yani, dosbox'ta çalıştırmalısınız. Fiziksel COM'u bios.h arayüzlerine iletir. – zabulus

+0

Ne demek istediğini tam olarak anlayamadım? DosBox'ta Mingw'de geliştirilen programımın .exe dosyasını çalıştırabilir miyim? Evet ise nasıl? – iammurtaza

+0

Sorunuzda hakkında bilgi verdiniz. COM bağlantı noktası ile iletişim kurmak için bu dosya dos ortamında kullanılmış gibi görünüyor. Modern pencerelerde bu şekilde iletişim kurma olanağı mevcut değil. Derleme exe'nin windows ortamında çalıştırılmasını istediğinizi varsayalım. Bu durumda başka bir API kullanmalısınız. "CreateFile COM1" – zabulus

cevap

34

burada bir göz atın:

1)Bunu Windows ile kullanabilirsiniz (dahil. Linux yanı sıra MinGW). Alternatif olarak sadece kodu örnek olarak kullanabilirsiniz.

2) Kelimenin tam anlamıyla

İşte MinGW bu kullanabilirsinizpencereler

3) seri bağlantı noktalarını nasıl kullanılacağınıAdım adım öğretici gerçekten, çok çok var (herhangi bir hata işleme veya ayarlar olmadan) basit kod:

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

Artık yazma/okuma baytları için WriteFile()/ReadFile()'u kullanabilirsiniz. Bağlantınızı kapatmak unutmayın :

CloseHandle(serialHandle); 
+1

Sanırım "GetCommState" yerine ikinci kez "SetCommState" çağırıyor olmalısınız? – Ben

+0

Haklısınız, bu bir hatadır - ipucu için teşekkürler, düzeltdim. – ollo

+0

Linux'ta da kullanabileceğinizi söylüyorsunuz, fakat siz '' nolu "#include? Linux/OSX üzerinde çalışacak/olmayacaksa emin değilim. – Paul

İlgili konular