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ı
cevap
burada bir göz atın:
- RS-232 for Linux and Windows1)
- Windows Serial Port Programming2)
- Using the Serial Ports in Visual C++3)
- Serial Communication in Windows
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);
Sanırım "GetCommState" yerine ikinci kez "SetCommState" çağırıyor olmalısınız? – Ben
Haklısınız, bu bir hatadır - ipucu için teşekkürler, düzeltdim. – ollo
Linux'ta da kullanabileceğinizi söylüyorsunuz, fakat siz '
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
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
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