2013-04-03 70 views
22

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++

+0

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

+0

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

+0

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

Trả lời

34

Hãy xem ở đây:

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); 
+1

Tôi nghĩ bạn nên gọi 'SetCommState' thay vì 'GetCommState' lần thứ hai? – Ben

+0

Bạn nói đúng, đó là một sai lầm - cảm ơn vì gợi ý, tôi đã sửa nó. – ollo

+0

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 không chắc chắn nếu nó sẽ/sẽ không hoạt động trên Linux/OSX. – Paul

Các vấn đề liên quan