我正在尝试在 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);