2

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

如果我从设备管理器停用并激活 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);
4

2 回答 2

1

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

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

于 2014-10-28T13:20:54.663 回答
0

将您的设置更改为:

"115200,NOPARITY,8,ONESTOPBIT"

于 2017-05-12T14:56:02.790 回答