You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows平台下用C语言获取串口DTR与RTS引脚状态方法问询

在Windows平台读取串口DTR/RTS引脚状态的方法

在Windows下读取串口的DTR和RTS状态确实不像Linux用ioctl(TIOCMGET)那么直观,但通过Win32 API的GetCommModemStatus函数完全可以实现需求,下面是具体的实现思路和代码示例:

核心API:GetCommModemStatus

这个函数专门用于获取串口调制解调器的状态信息,其中就包含了DTR和RTS引脚的当前激活状态。它会返回一个DWORD类型的状态掩码,我们只需要通过对应的位掩码提取需要的引脚状态即可。

代码实现示例

首先确保你的代码包含windows.h头文件,然后可以封装两个简单的函数分别获取RTS和DTR的状态:

#include <windows.h>
#include <stdio.h>

// 获取RTS引脚状态
BOOL GetRTSState(HANDLE hSerialPort, BOOL* pIsRTSOn) {
    if (!hSerialPort || !pIsRTSOn) {
        return FALSE; // 无效参数
    }

    DWORD modemStatus = 0;
    if (!GetCommModemStatus(hSerialPort, &modemStatus)) {
        // 获取失败,可通过GetLastError()查看具体错误
        return FALSE;
    }

    // MS_RTS_ON是预定义的位掩码,对应RTS激活状态
    *pIsRTSOn = (modemStatus & MS_RTS_ON) ? TRUE : FALSE;
    return TRUE;
}

// 获取DTR引脚状态
BOOL GetDTRState(HANDLE hSerialPort, BOOL* pIsDTROn) {
    if (!hSerialPort || !pIsDTROn) {
        return FALSE;
    }

    DWORD modemStatus = 0;
    if (!GetCommModemStatus(hSerialPort, &modemStatus)) {
        return FALSE;
    }

    // MS_DTR_ON对应DTR激活状态
    *pIsDTROn = (modemStatus & MS_DTR_ON) ? TRUE : FALSE;
    return TRUE;
}

使用示例

假设你已经通过CreateFile成功打开了串口并获得了句柄hSerial,就可以这样调用上面的函数:

int main() {
    // 示例:打开COM1串口,实际使用时请根据你的串口调整参数
    HANDLE hSerial = CreateFile(
        L"COM1",
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL
    );

    if (hSerial == INVALID_HANDLE_VALUE) {
        printf("打开串口失败!\n");
        return 1;
    }

    BOOL rtsOn, dtrOn;
    if (GetRTSState(hSerial, &rtsOn)) {
        printf("RTS引脚状态:%s\n", rtsOn ? "ON" : "OFF");
    } else {
        printf("获取RTS状态失败!错误码:%d\n", GetLastError());
    }

    if (GetDTRState(hSerial, &dtrOn)) {
        printf("DTR引脚状态:%s\n", dtrOn ? "ON" : "OFF");
    } else {
        printf("获取DTR状态失败!错误码:%d\n", GetLastError());
    }

    // 别忘了关闭串口句柄
    CloseHandle(hSerial);
    return 0;
}

注意事项

  • 调用GetCommModemStatus前必须确保串口句柄是有效的(即CreateFile打开成功,不是INVALID_HANDLE_VALUE)。
  • 如果你之前用EscapeCommFunction(hSerial, SETRTS)设置过RTS状态,调用这个函数就能获取到最新的状态。
  • 除了RTS和DTR,GetCommModemStatus还能返回CTS、DSR等其他调制解调器信号的状态,对应的位掩码可以查看官方文档里的定义。

内容的提问来源于stack exchange,提问作者Fifi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:10:50