C++中串口(RS-232)连接

39

我曾经使用16位编译器(Turbo C++ IDE)通过串口RS-232连接进行了C++开发,包括头文件bios.h,其中包含了从端口读取值所需的所有函数。现在我想要使用C++ 32位Mingw编译器从串口读取值,我的IDE是Dev CPP。但是在这里我找不到bios.h,在Mingw中是否有针对此目的的特殊头文件?现在我使用32位编译器,因为在我的学校项目中我需要使用异常处理,而我猜测Turbo C不支持。请帮帮我。


我认为你不能像在<bios.h>中那样直接从用户模式使用COM进行工作。如果你想使用旧的连接,你应该继续使用16位编译器,并在某个DOS模拟器中运行你的应用程序,比如dosbox。它会将物理COM端口转发到bios.h接口。 - zabulus
我无法完全理解你的意思。我能在DosBox中运行使用Mingw开发的程序的.exe文件吗?如果可以,应该怎么做? - iammurtaza
在你的问题中,你提到了<bios.h>。看起来这个文件是在dos环境下用于与COM端口通信的。现代Windows上已经不支持这种通信方式了。我猜你想要编译后的exe在Windows环境下运行。在这种情况下,你应该使用另一个API,即搜索"CreateFile COM1"。 - zabulus
3个回答

70
请看这里:

1) 你可以在 Windows(包括 MinGW)和 Linux 上使用它。或者,你可以将代码仅作为示例使用。

2) 逐步教程,介绍如何在 Windows 上使用串口。

3) 你可以直接在 MinGW 上使用它。

这里提供了一些非常简单的代码(没有任何错误处理或设置):

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

现在你可以使用WriteFile()/ReadFile()来写入/读取字节。不要忘记关闭你的连接:

CloseHandle(serialHandle);

你说你也可以在Linux上使用它,但是你'#include <windows.h>'吗?我不确定它是否能在Linux/OSX上工作。 - Paul
2
不,您可以在两个系统上使用链接中的信息/代码。我的答案中的代码仅适用于Windows。 - ollo
1
第二个链接已经失效,但是另一个副本(根据文件名)可以在http://bd.eduweb.hhs.nl/micprg/pdf/serial-win.pdf找到。 - Seabass77
第二个链接已经失效了,请问有其他的替代链接吗? - John Sall

3

或者您可以直接使用boost::asio::serial_port


3

对于上面的答案, 默认串口是

        serialParams.BaudRate = 9600;
        serialParams.ByteSize = 8;
        serialParams.StopBits = TWOSTOPBITS;
        serialParams.Parity = NOPARITY;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接