Tôi đã thực hiện kết nối RS-232 cổng nối tiếp trong C++ bằng trình biên dịch 16 bit (Tôi đã sử dụng Turbo C++ IDE). Nó bao gồm tiêu đề tập tin bios.h
có chứa tất cả các chức năng cần thiết để đọc các giá trị từ cổng. Bây giờ tôi muốn đọc giá trị từ cổng nối tiếp bằng cách sử dụng trình biên dịch C++ 32-bit Mingw. Tôi đang sử dụng Dev CPP làm IDE của tôi. Ở đây tôi không thể tìm thấy bios.h
. Có bất kỳ tập tin tiêu đề đặc biệt có sẵn cho mục đích này trong Mingw? Tôi đang sử dụng trình biên dịch 32-bit bây giờ bởi vì trong dự án đại học của tôi, tôi đã sử dụng xử lý ngoại lệ mà tôi đoán không được hỗ trợ trong Turbo C. Xin hãy giúp tôi.Kết nối Cổng Nối tiếp (RS -232) trong C++
Trả lời
Hãy xem ở đây:
- RS-232 for Linux and Windows1)
- Windows Serial Port Programming2)
- Using the Serial Ports in Visual C++3)
- Serial Communication in Windows
1)Bạn có thể sử dụng tính năng này với Windows (incl. MinGW) cũng như Linux. Thay thế bạn chỉ có thể sử dụng mã làm ví dụ.
2)Step-by-bước hướng dẫn làm thế nào để sử dụng cổng nối tiếp trên cửa sổ
3)Bạn có thể sử dụng theo nghĩa đen trên MinGW
Dưới đây là một số rất, rất mã đơn giản (không có bất kỳ xử lý hoặc cài đặt lỗi nào):
#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);
Bây giờ bạn có thể sử dụng WriteFile()
/ReadFile()
để ghi/đọc byte. Đừng quên để đóng kết nối của bạn:
CloseHandle(serialHandle);
Tôi nghĩ bạn nên gọi 'SetCommState' thay vì 'GetCommState' lần thứ hai? – Ben
Bạn nói đúng, đó là một sai lầm - cảm ơn vì gợi ý, tôi đã sửa nó. – ollo
Bạn cho biết bạn cũng có thể sử dụng nó trên Linux, nhưng bạn '#include
Tôi nghĩ rằng bạn sẽ không sẵn sàng làm việc từ sử dụng chế độ với COM trực tiếp như trong. Nếu bạn muốn sử dụng kết nối cũ, bạn nên tiếp tục sử dụng trình biên dịch 16 bit và chạy ứng dụng của bạn trong một số trình mô phỏng dos, ví dụ: dosbox. Nó sẽ chuyển tiếp vật lý COM tới các giao diện bios.h. –
zabulus
Tôi không thể hiểu hoàn toàn những gì bạn muốn nói? Tôi có thể chạy tập tin .exe của chương trình đã được phát triển trong Mingw trong DosBox không? Nếu có thì sao? – iammurtaza
Trong câu hỏi của bạn, bạn đã nói về. Có vẻ như tệp này đã được sử dụng trong môi trường dos để giao tiếp với cổng COM. Cách giao tiếp trên các cửa sổ hiện đại hiện không có sẵn. Tôi giả sử bạn muốn exe biên dịch được chạy trong môi trường cửa sổ. Trong trường hợp này, bạn nên sử dụng một API khác. ví dụ: google cho "CreateFile COM1" –
zabulus