串行COM端口无法打开

时间:2013-04-07 13:19:39

标签: c winapi serial-port

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

如果我从设备管理器中取消激活并激活COM端口(因此端口刚刚未使用)我只需用Teraterm或Putty打开COM端口,然后关闭它然后运行我可以发送和接收的软件在任何时候。

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

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

这是一种非常奇怪的行为。好像我需要在我可以使用它之前进入COM(我正在使用FTDI转换器),当PC重新启动或我从设备管理器停用并激活COM时,似乎这个INIT消失了,我只需要打开COM使用另一个串行软件恢复它,然后使用我的软件。

注意:一旦端口是INIT,我就可以完全控制我的软件。我确信我的代码真正打开了COM端口,因为如果我尝试将iNIT与其他软件一起使用,那么一旦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);

1 个答案:

答案 0 :(得分:1)

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

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

相关问题