【问题标题】:Serial COM Port not opening串行 COM 端口未打开
【发布时间】:2013-03-29 13:46:45
【问题描述】:

我正在尝试在 Win32 应用程序中打开串行 COM 端口。端口正确打开,但如果我之前使用 Teraterm 或 Hyperterminal 打开它,我可以发送接收字节。

如果我从设备管理器停用并激活 COM 端口(因此该端口刚刚未使用),我只需使用 Teraterm 或 Putty 打开 COM 端口,然后关闭它,然后运行我的软件,我就可以正确发送和接收随时。

我正在使用 Embarcadero X3 和 FileMonkey 使应用程序同时兼容 MACOSX 和 Win32。 FileMonkey 不支持 VCL。

相同的代码在使用 VCL 的 Builder 6 c++ 上运行良好,但无论如何它不应该影响它。我的代码很简单。

这是一种非常奇怪的行为。似乎我需要先初始化 COM(我正在使用 FTDI 转换器)才能使用它,当 PC 重新启动或我从设备管理器停用并重新激活 COM 时,似乎这个 INIT 已经消失了,我只需要打开COM 使用另一个串行软件恢复它,然后使用我的软件。

注意:一旦端口初始化,我就可以完全控制我的软件。我确信我的代码确实打开了 COM 端口,因为如果我尝试将它与其他软件一起使用,那么一旦 iNIT 完成,COM 就会显得很忙。所以到目前为止没有闪烁警报,而且应​​用程序正在另一边工作。

我有这个问题很久了,我现在决定解决它!

这是我的代码:

// GLOBAL VARIABLES
HANDLE hComm = NULL;
COMMTIMEOUTS ctmoNew = {0}, ctmoOld;

DCB dcbCommPort; 
      hComm = CreateFile("COM2",

                      GENERIC_READ | GENERIC_WRITE,
                      0,
                      0,
                      OPEN_EXISTING,
                      0,
                      0);

    if(hComm == INVALID_HANDLE_VALUE)
     {

        Application->Terminate();
     }

    GetCommTimeouts(hComm,&ctmoOld);
    ctmoNew.ReadTotalTimeoutConstant = 100;
    ctmoNew.ReadTotalTimeoutMultiplier = 0;
    ctmoNew.WriteTotalTimeoutMultiplier = 0;
    ctmoNew.WriteTotalTimeoutConstant = 0;
    SetCommTimeouts(hComm, &ctmoNew);
    dcbCommPort.DCBlength = sizeof(DCB);
    GetCommState(hComm, &dcbCommPort);
    BuildCommDCB("115200,N,8,1", &dcbCommPort);
    SetCommState(hComm, &dcbCommPort);

【问题讨论】:

    标签: c winapi serial-port


    【解决方案1】:

    将您的设置更改为:

    "115200,NOPARITY,8,ONESTOPBIT"

    【讨论】:

      【解决方案2】:

      只是一种可能性,不确定这是问题所在。

      但与我们典型的 COM 端口打开代码的一个不同之处在于,我们在 CreateFile 成功后直接使用 SetupCom 并设置我们的缓冲区大小,通常为 4KB。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-20
        • 1970-01-01
        • 2012-08-09
        • 1970-01-01
        • 1970-01-01
        • 2014-12-18
        • 2015-05-30
        相关资源
        最近更新 更多