我想在Win32应用程序中打开串行COM端口。端口打开正确,但我可以发送一个接收字节,只要我以前使用Teraterm或超级终端打开它。串行COM端口没有打开
如果我从设备管理器中禁用并激活COM端口(所以端口刚刚未使用),我只需用Teraterm或Putty打开COM端口,然后关闭它然后运行我的软件即可发送和接收在任何时候都适当。
我正在使用Embarcadero X3和FileMonkey使应用程序与MACOSX和Win32同时兼容。 FileMonkey不支持VCL。
相同的代码使用VCL在Builder 6 C++上正常工作,但它不应该影响它。我的代码非常简单。
这是一个非常奇怪的行为。似乎我需要INIT 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);