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

Posted

技术标签:

【中文标题】C++ 中的串行端口 (RS -232) 连接【英文标题】:Serial Port (RS -232) Connection in C++ 【发布时间】:2013-04-03 17:48:54 【问题描述】:

我已经使用 16 位编译器在 C++ 中完成了串行端口 RS-232 连接(我使用的是 Turbo C++ IDE)。它包括头文件bios.h,其中包含从端口读取值所需的所有函数。现在我想使用 C++ 32 位 Mingw 编译器从串口读取值。我正在使用 Dev CPP 作为我的 IDE。在这里我找不到bios.h。 Mingw 中是否有任何特殊的头文件可用于此目的?我现在使用的是 32 位编译器,因为在我的大学项目中,我必须使用我猜 Turbo C 不支持的异常处理。请帮帮我。

【问题讨论】:

我认为您将无法像在 中那样直接在 COM 的用户模式下工作。如果您想使用旧连接,则应继续使用 16 位编译器并在某些 dos 模拟器(即 dosbox)中运行您的应用程序。它将物理 COM 转发到 bios.h 接口。 我无法完全理解您的意思?我可以在 DosBox 中运行我在 Mingw 开发的程序的 .exe 文件吗?如果是怎么办? 在您的问题中,您提到了 。看起来这个文件是在dos环境中用于与COM端口通信的。这种在现代 Windows 上进行通信的方式现在不可用。我假设您希望编译 exe 在 Windows 环境中运行。在这种情况下,您应该使用另一个 API。即谷歌“CreateFile COM1” 【参考方案1】:

请看这里:

RS-232 for Linux and Windows 1) Windows Serial Port Programming 2) Using the Serial Ports in Visual C++ 3) Serial Communication in Windows

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 '?我不确定它是否会/不会在 Linux/OSX 上运行。 不,您可以在两个系统上使用链接中的信息/代码。我的答案中的代码仅适用于 Windows。 第二个链接已失效,但另一个副本(此处没有文件名)位于bd.eduweb.hhs.nl/micprg/pdf/serial-win.pdf 第二个链接失效了,请问有什么替代方案吗?【参考方案2】:

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

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

【讨论】:

【参考方案3】:

或者你可以使用boost::asio::serial_port

【讨论】:

以上是关于C++ 中的串行端口 (RS -232) 连接的主要内容,如果未能解决你的问题,请参考以下文章

识别 USB 转 RS422 连接器所连接的 COM 端口名称的逻辑(适用于 Windows 应用程序)

没有与连接的串行端口通信?

在串行端口(QtSerialPort)读取传入字节的连续流

如何自动检测串行 COM 端口 c# 的连接

串行通信 C++ ReadFile()

使用串行端口连接智能卡时 CadClientInterface.powerUp() 挂起